Yeah I know what you mean, I usually just don't trust the restart event and go with my own ' on function "reset" '.
Depends on how much stuff you need to restart I suppose.
Having said that I just created a blank project to play around with resetting stuff.
I added 2 sprites, 1 for position, 1 for visibility. I added a variable which was displayed via a text object and set through a textbox object. Also added a button to go to layout 2.
From layout 2 I had a button that, "on click" calls: System>Go to Layout 1 & System>Restart Layout & System>Reset Global Variables to default.
Layout 1 does reset properly from layout 2. The global variable gets zeroed, positions and visibility all go back to initial states.
I'll add that I was surprised to find that BOTH layouts got reset.
If a sprite gets it's Visibility from a global variable (eg. if x=1 sprite invisible) AND you DON'T Reset Global Variables to default then a "restart layout" wont effect it's visibility.
System>Restart Layout
System>Reset Global Variables to default
That should Nuke everything back to 0.
If not, Write a Function that sets everything how you want it to be and call it On Start of Layout.
here's another way that just came to mind:
Menu layout, start game button > goes to Layout "Game" & sets a Variable "new_game" to 1.
On Start of Layout "Game", if "new_game" = 1 Restart Layout & Set "new-game" to 0.
By the way, probably isn't related to your question but you can right click on Variables and send them to other Event Sheets.
Oh and use Local variables where needed, which can be added to Groups.