The "best" way is the way that allows you to finish your game and ship on time.
Trying to architect the whole thing upfront is not necessarily the best idea because there may be things you don't consider, and then you come into road blocks later in development.
I find my favorite way to make progress is to get a prototype working by any method (even having a bunch of code all in one file) and then after you understand the algorithms used and the requirements for the app, then you can refactor into the optimal method. Unfortunately, Godot doesn't have great refactoring capabilities, so this is a little more difficult (maybe it can be done in an external editor, haven't tried that yet) so this may not be super smooth.
Also, you think AAA games have perfect architecture, but AAA devs do all sorts of hacks in order to ship on time. This is just what I heard, since generally they don't release the code. But if you look at, for example, the character code for Celeste, it's a mess. I mean, it works and made a successful game but it's some of the worst architecture I've seen (basically a bunch of global variables). So don't let the design phase bog you down, even great games can be made with poor design.
However, to get back to your question. Ideally you want to minimize dependencies, otherwise you quickly get into problems with class A needing B and B needing A and it becomes circular. Signals are one method that greatly helps. Though there is still some coupling, it is reduced and you also have a clear API which is easier to test. Also, try to make the class do all it's own processing and only need a few parameters (that can be sent in the signal) that way you don't have outside objects affecting it. Then make methods on the objects, if things do need to be processed, don't just change variables from the outside. Try to get other objects based on events (like an area overlap, ray cast collision, etc.) rather than searching for the objects directly. If done right, you can almost eliminate dependencies completely.
Also, having a Node object and script with helper functions is fine. I don't think this is a bad design. However, if it only works on a specific type, then having those functions as static on the class may be more streamlined. But sometimes you have general functions (for example, math equations) that can be used on multiple scripts, so having the Node method may be better.
So, yeah, there are a lot of ways of doing things, and there is no "best" way necessarily if you finish your project, that is the goal.