I'm no expert on the subject, but it seems to me that the difference is conceptual, more than mechanical.
A port is more like an Erlang process.
A C node is more like another Erlang node.
Conversely, starting of a port is initiated from Erlang, whereas starting of a C node will probably be initiated outside of the EVM.
If you control starting of a port from Erlang, you can for example start multiple instances of the same script, balance the request to them (for example via poolboy) and restart each one separately if it crashes.
Which is exactly what I do in production.
On a mechanical level, communication via stdio seems simpler in comparison to C node version.