Additionally to Inces' answer, I would say the "cleanest" solution used in software projects is dependency injection. It's somewhat finicky to implement in godot, but that is a very clearly documented way to see what dependencies your script/scene has. It also makes it a lot easier to test.
An idea I've been toying with is extending
SceneTree with a class that has access methods for nodes my scenes would commonly access. If you formulate the architecture correctly, this could replace both autoloads and "global
get_node() based" access.