pyserial and more generally python is not suited to hard real time systems, as it was simply not designed for that application, due to duck typing and other runtime provisions cannot provide deterministic latency. Depending on what you want to do you can write all your hard real time subsystems in C or some other system that is suitable for hard realtime systems and then do data processing in the background in python.
You could test this behaviour by sending a byte, having pyserial read it and do some operation (say multiply them by 2) and spit the serial string back out. You could then probe the TX and RX lines on an oscilloscope and find the latency between the first byte in and the first byte out and I would guess that you would see a jitter of 1ms or more, in most hard real time systems I have worked with the jitter is below 10us (100 times less).
Though for a balancing robot you might find that that latency and jitter is acceptable, I would suggest you try it out and see how it works and if it does not work for you then move on to writing your code in a language that is suited for Hard Realtime.