Hah ... working out the timing of this is soup-of-clocks. The pausing the ghosts BEFORE they go somewhere you can't see if perfect.
But there are 3 or 4 different timing scenarios that can go on here to do this right:
1. Someone else's demo may have a high fps or a low fps.
2. A demo may not start at cl.time 1
3. The data collection process that runs through a demo (at 30,000 - 100,000 fps = essentially instant

) --- which is like timedemo without the rendering or sound --- I don't have it waste space by writing if the player didn't move or look around or change frame (but it does record the cl.time obviously).
4. I need to allow for not only the client to be paused (opening the console in single player, for instance) but to stop the ghost so the player can catch up.
I've almost got this last part cracked. I have to have a virtual time (ghost time converted to client time) and if everything is paused then update the virtual time baseline and keep track of a "future time" which is essentially when we read again after cl.time exceeds that.
[But in reality, it is just slightly more of a mess than CL_RelinkEntities mtime[0]/ mtime[1] frac stuff. Unfortunately, like that, ghosts have to figure out if they teleported to avoid improper movement interpolation.]
/Note: Do you think Quake draws fast with the console up? I discovered that with a lot of text on-screen, it is actually very slow to render. This shouldn't be a surprise I guess, but I noticed my command to run through a demo hit only 400 fps with a lot of console text on the screen and 1100 fps with a clear console. When I had it stop refreshing the rendering entirely while the command was running, it hit several tens of thousands fps. The console is still on screen, it just isn't needless re-drawing it so it isn't like the screen is black, no it looks quite normal when the command is running.