Do you think live.observer uses more cpu per se or is it totally dependent on the refresh rate?
Also the get length value means something different depending on whether looping is on/off. And whether warping is on/off.
Havent had time to try this but maybe it'd be possible to get the initial playing position, then update/calculate using tempo but check the position (at a low polling rate) and see if anything has changed eg scrubbing/looping/follow action etc. Plus checking for tempo changes of course.
You think this would work? It might give better resolution feedback with less api calls?