They’re useful for different purposes, many to do with OOP principles.
__index allows for inheritance (by searching other tables, you can extend it to search other tables for inheriting form multiple objects). It also has uses for access control in being used on a gateway table to block/control access to another table.
The mathematical ones __add, __div etc. are useful if you’re making custom objects which you want to apply mathematical principles by just using the standard operator symbols inline in your code. e.g. if you were implementing your own version of Vector2 you could now do table1 + table2 and can script __add to give table3 rather than having to do table1.add(table2).
__mode is useful for weak tables, which are used for modules. If you have a module which makes a table, and you want to store state information which isn’t directly accessible to a script using the module. For example if you again implemented a custom Vector2 class, but on every 4th addition it multiplied the value, you could store the vector2 table object as the key to a weak table, and the number of additions as a value to check when it is time to do the multiplication.
I use __call as a way to start services in module scripts which I want other modules to be able to access but not run the service code. e.g. module = require(script.Parent) to use the module and require(script.Parent)() to start it as a service from another script. There will be other uses, and really I think it is down to your creativity how you wish to use the metamethods.
I’m not sure what you mean by stronger (as could be confused with the terminology of a weak table), but it allows you to use them in much more expressive ways, yes.