1. This is the right approach. I do the same in my games. Alternatively, you can put events into different groups and deactivate/activate groups. For example, if menu buttons are invisible and should be disabled, deactivate Menu_Events group. When player taps Menu icon, deactivate platform controls and activate Menu_Events group.
2. You can add another condition "Retry is on layer..":
On Retry tapped
and Retry is on layer "GameOverLayer"
and layer "GameOverLayer" is visible
On Retry tapped
and Retry is on layer "PauseLayer"
and layer "PauseLayer" is visible
3. I also suggest adding "Wait 0" before making layer visible/invisible.
Say, you have two buttons (MenuOpen and MenuClose) in the same position on the screen, but on different layers:
On tapped MenuOpen -> Set layer "Menu" visible
and layer "Menu" is NOT visible
On tapped MenuClose
and layer "Menu" is visible -> Set layer "Menu" invisible
With events like this, tapping MenuOpen will make layer visible, but then the same tap will be registered in the next event on MenuClose button, and the layer will immediately become invisible again. Adding "Wait 0" before changing layer visibility will fix this problem.
EDIT: you can actually optimize all these events by adding all clickable objects to a family, create a family instance variable buttonFunction, and make this generic event:
On tapped ButtonsFamily
ButtonsFamily is visible
Layer ButtonsFamily.LayerNumber is visible -> Function call (ButtonsFamily.buttonFunction)