You can also do it without singletons:
In my game, I have a "host" scene inside of which I instantiate the level under a known node. When I need to restart the level, I simply destroy the level, then re-instantiate it.
The reason for this technique is to prevent other parts of the scene to get wiped out (GUI elements, game variables, sound node, global animations...), so you don't need to reload everything and you can keep some nodes between retries.
Another technique I use (but more complicated depending on your levels) is to consider that "destroyed" is just a state, so you never destroy and never create elements in the level. If you have a script to remember their initial state, then reloading the level just requires to go back to initial states with a group event. This is very fast because you allocate less memory and fewer nodes are recomputed. But you'll want another technique if your level evolves too much.