You can keep your globals if you want, just copy the value from the instance variable into it when the layout starts.
I have an invisible object called LevelGoal at the end of each layout. When the player touches it, I have a condition that reads the instance variables from it. I also have global variables for the high score for each level, the number of gems for each level and if the level was beaten.
When the user touches(collides with) the LevelGoal sprite, I check to see if the current level score is greater than the current levels score and if so I copy it into the global variable to replace the old high score. I also Set the Variable for if the level was beaten to yes. This is important because in my game a level can only be unlocked if the level before it has been beaten.
On my level select screen I have code that looks at the state of if certain levels were beaten for other things as well, for example in my game every 4 levels beaten you learn a new ability. So by tracking if level 4,8,12 are beaten I can control what abilities the player has. This also means that once they have beaten those levels, they can go back and play them with their new moves since I track that those moves are now unlocked for them to use.
This is just an example of how I do things and may not be the best or most efficient but it gives me a system that I can easily understand exactly where a player is in the game and what they have done.
Also by storing the stats in globals I can do other things, for example my system of awarding medals to players is based on looking at a combination of how many gems they found in the level as well as their score. My level select screen then uses this to properly display what medal they have been awarded for that level (Bronze, Silver, Gold, Platinum, etc...).