There are indeed 2 main ways of sending messages
A Message Send Event and a Message Send Task. from an implementation point of view they would be the same. A java class that does something like this:
execution.getProcessEngineServices()
.getRuntimeService()
.createMessageCorrelation("MessageName")
.processInstanceBusinessKey("BusinessKey")
.correlate();
One of the differences is indeed the ability to add a multi-instance but more importantly you can add a boundary event… for example an Error Boundary event. This can be quite useful.