That is not fully true as __MODULE__.foo() is also remote call. In short the difference between remote and local call is that you put the module name before remote call.
The advantage and disadvantage of the remote calls is exactly the same:
The remote call allows for the hot code reload, which mean that it need to check if there is no newer code each time it is called.
However if you are trying to use local call as a lambda in form of &foo/0 then it will be slower than &__MODULE__.foo/0 as the second can be as a constant so will be faster to call.
Though here we have to remember, that for &__MODULE__.foo/0 to work, the function needs to be exposed/public, by using def, while when doing &foo/0 the function is allowed to be private (defp).
Thank you very much @hauleth and @NobbZ for the explanation! Is this kind of things (I mean ignorance here) that triggers the impostor syndrome in me… than I remember It’s all in my mind. Nothing serious indeed.