You should never call other modules like that, that will create a tight coupling between the two, and makes it no longer modules.
Further more, modules are frontend code (controllers, models, views), support classes should go into a package (which can be called from anywhere).
If you have a legitimate need for a cross-module call, you should use an HMVC request, in a try/catch block that catches HttpNotFoundException (so you can capture the HMVC url failing).
And in case I need to use models, use \ module :: load ('module'); is it a good option? I have a module named product, and inside that module I have created a folder called repository, and all the custom querys I make inside the product repository, and when I need to use this repository in another module I use \ module :: load ('product '), is it a good way?
If you want to "modularize" your application/backend code, use packages, not modules. Only use modules for your frontend code, so controllers, views, and everything else that needs to be contained by that module.
Having said that, the same remark also applies for the coupling issue, as in both cases you create a tight coupling, meaning you can't remove the module or the package without your application crashing.
This is why the safest method is using an HMVC call, as that allows you to capture the not-found situation.
And having said that, in the end it is your application, from a technical point of view all options work. This has always been a cornerstone in Fuel development, the framework should never dictate the developer how to solve a specific issue.