So what's wrong with my Undo system that uses system Save/Load actions? I understand that you need to tweak your events in order not to call "SaveUndoStep" too often (only when any operation is finished) and it may be a difficult task. But you will have the same challenge with any other Undo system! Because if, for example, you are rotating an object and saving 100 undo steps along the way, you will need to press Ctrl-Z 100 times to undo that rotation.
So yeah, it doesn't matter if the undo system saves information into local storage, or array, recreates objects or not, you still need to figure out how and when you are saving undo step for every operation in your app.
.
Here is an idea that just came to me - if everything in your app is done with mouse, use a single "On mouse button released" event to save undo steps! Set a flag UndoStepSaveRequired=true in all events when any object is changed/created/deleted, you can do this on every tick, no problem. Then in "On mouse button released" event you check for this flag and call the function to save undo step if needed.