> Once Controller receives an event, it calls app.hideGUI();
I have no idea how your controller receives an event. I am guessing the event is being sent to the controller on a
thread which is not the JavaFX application thread.
If this is the case you need to surround your code in a Platform.runLater construct to allow that code to execute on the JavaFX application thread.
I don't know if the above is your issue or your only issue.
Note that if you hide all the stages, the JavaFX runtime will exit, so if you want to temporarily hide the stages and then at a later time show them again, then you need to keep the platform running by invoking Platform.setImplicitExit(false); before you hide the stages. If you do that you will eventually need to explicitly exit the JavaFX platform at some stage when your application is supposed to shut down. You can do this by calling Platform.exit();