Function call usually means static binding (call a specific address) or at best a virtual call (call address from a vtable).
Messaging is much more flexible - the receiver can have a custom dispatch function that looks at the message and chooses the implementation in a Turing-complete way (like "call foo if third argument is 7, bar otherwise"), logs the message, duplicates it to send to multiple implementations, serializes it to send over the network, whatever.
Obviously for this to be efficient, the underlying system often optimizes "sending a message" to "calling a function".
Messaging is much more flexible - the receiver can have a custom dispatch function that looks at the message and chooses the implementation in a Turing-complete way (like "call foo if third argument is 7, bar otherwise"), logs the message, duplicates it to send to multiple implementations, serializes it to send over the network, whatever.
Obviously for this to be efficient, the underlying system often optimizes "sending a message" to "calling a function".