It sounds like you’re using too many modules (gasp that’s not supposed to be possible!)
In my mind, a module should be created when you notice a significant amount of code that could be generalized. If it can’t be generalized, then it should probably remain in its original .script file instead.
Another way of thinking about it is to ask yourself “could I make this chunk of code into an external library that’s usable by others?” Again this comes back to the need for generalization. If you’re placing Ship-specific code (for example) into a module, and that code depends on code in other modules, then it likely shouldn’t be in a module at all.
I see a lot of confusion arising from developers moving too much of their code into .lua files simply to avoid a small amount of boilerplate code. This can cause unintended complexities and confusion. If I had to choose between some boilerplate vs complexity, I would choose boilerplate.
Of course, one exception to the generalization rule is something like raw data tables.
Edit 2024: Module mess - how do you structure your projects? - #21 by WhiteBoxDev