A significant difference not mentioned is that macros can be parameterised, so that each macro expansion need not generate the same code sequence each time, whereas a function is coded once and that's it. Macro parameterisation is really one of the neat features, lending macro usage not just to inlined code, but to code sequences that are, for example, essentially the same in purpose, but that require to be coded differently in different situations. Examples might be setting PCL and PCLATH appropriately prior to a table lookup, based on the value of a label value.
A further possible advantage of macro's is to be frugal on stack usage. If call nesting in an app may reach the hardware stack depth limit, but memory is plentiful, pushing some routines into macros may be beneficial.
About return insns, whilst call/returns have to match, if the last instruction of a subroutine before the return is a call, the trick of tail call elimination (a GOTO to the subroutine rather than a CALL) can be used to save a return instruction and a couple of cycles.
Nick