I can't really say anything about differences regarding performance, resource usage. I'd expect tcp input in logstash to be somewhat faster, as no additional protocol overhead is involved + no latencies for waiting for logstash to ACK events (unless OS/network buffers fill up generating back-pressure on nxlog). In newer beats, one can enable pipelining requests to overcome some network and encoding latencies. By default beats->logstash uses compression. This requires some more CPU+buffers for encoding/decoding, but reduces network overhead (depending on content maybe by a factor of 6 or 7 if you're lucky). In logstash 2.4 and upcoming 5.0 release, the beats plugin was rewritten with lumberjack protocol being reimplemented in java based on netty, whereas TCP plugin is still ruby based. Beats->logstash uses JSON + adds quite an amount of meta-data (which can be filtered out in 5.0 release), adding some additional encoding/decoding overhead. Not sure about nxlog here.
There are a many parameters/differences and more recently changes to logstash, I have a hard time giving any kind of forecast what you will see. I'd propose setting up some benchmarks and compare CPU/memory usage + network throughput in number of events, but also amount of bytes being transmitted. With benchmarks available one can start tuning, e.g. modify parameters in beats outputs or limit resources used by beats using cgroups (or containers, or taskset). Beats also support load-balancing to multiple logstash instances, or configure beats to use one logstash instance by random, in order to scale horizontally if required.