That's my take too. You'd have to preserve the entire execution state at that moment in time, including the coroutine scheduler. That's probably easier with some virtual execution model (VM) instead of native threads, stacks, etc.
The whole mess also has to be deterministic too, or as you say, it won't have the same outcome across save/load.