Yes, you can definitely just store the positions of objects for 30 seconds (at 60 fps this is 1800 frames, which is not much data for a modern computer). However, things do get more complex when you have animation playing, or particles, or other effects.
A more robust solution would be to send a signal on every relevant event, and save the events into an array (with their timestamp) that will play back later. An event could be "start running animation on player 3", "start goal particle effect on home goal", etc. The positions/rotations of objects probably should still be saved in the array per frame, as it would be a lot to have an event for every single position change.