Your question kind of boils down to, what is real time ?
In the end real time is what you want/specify for your system to work, whether it be hard real time or soft real time.
In practice ROS is not hard real-time, but is sufficient enough for most robotics applications.
It seems to be that you are trying to take into account the latency between your submodules in your system. By experience I would recommend you to first try assuming there are latencies and see how your system works, and if needed investigate the latency issue.
Now for the problem you describe I would rather use the time-stamp in messages because they should give you the date at which they where emitted and compare it with the current machine time (aka the time you get in 1) ). One of the main motivation of defining interfaces between component with timestamps, is to have this simple to way to check if the input that you want to use are fresh (no latency correction needed), less fresh (latency correction to be taken into account) or old (re-design of the architecture).
Now what can impact the delay/latency in the software your describe ?
It is the computational power required for your algorithms vs. the computational power at hand to run them. From your post it's hard to see, but a small board like (Pi,beaglebone,...) should be able to handle PID and Kalman filter (for reasonable number of states).
From a robotic perspective, balance boards are inverted pendulum so you try to stabilize an unstable equilibrium and you run your PID at 500Hz, from experience it sounds reasonable. Specifically because running faster and faster will increase your performances but at some point you will realize that the actuators are filtering the inputs so much that running the control faster dosen't bring anything.