Ugh... I was convinced you meant 3d... I really should have read the question more carefully. Ok, so you've got it going which is good and you don't want to create an unmanageable monster.
Managing a complex GUI:
- one option is to take a leaf out of modern websites and make a "base" layout with the high level division only. So, say the GUI has elements on top, bottom and right. So in your "base" scene you create the high level vboxes / hboxes and any persistent GUI elements.
- then you make scenes with the various sub-elements so everything is separated out into individual components and is manageable.
- add a script to your base GUI and you can spawn these GUI sub-elements in and out as needed. Add state setter methods.
- When you need functionality specific to one element you add a script to that element which your base GUI script can call.
- You can also consider making a custom class. You don't want to be repeating code.
The advantage is that you get more control but also that your code is now much more manageable. Want to fix a bug in your HP say you can just go to the scene for the element that you need and everything running it is in one place, all making intuitive sense.
Imagine you've got a contextual GUI element scrolling in from the right which changes completely depending on the trigger for example. Now you can spawn the GUI in your base GUI script, trigger the scroll, manage state of sub-elements, etc. You can bring in any number of completely different elements (scenes) depending on the trigger.
It might be a good idea to have the base GUI script holding the state (say, using an enum).
To call the GUI, I'd advise against hard coding paths. Unmanageable and brittle spaghetti code can easily result. Instead use signals (send as few as possible though, make sure you don't send one every frame). Singletons are also an option but you need to be careful with those for encapsulation reasons and personally I don't think there's any need here.
Or, you can make things neater and put everything in the GUI script. When a new object is added you can add it to an array/dict member variable of GUI interactables. That means your GUI script handles everything internally rather than being spread all throughout your code.
So yeah, long story short, break the GUI up into component elements and make it self-contained.
Complex is good, complicated is bad.