1. No concurrency
2. Concurrency on the same machine
3. Concurrency between machines
Of course there can be more distinctions, but those are very helpful for almost every case that I had to deal with.
Erlang's BEAM really nailes #3. The BEAM is just so cool, I'm surprised there are no similar products out there (if you know any, please tell me!).
Unfortunately for #2 I really don't like either Erlang nor Elixir. To nail 2, I found pure functional programming languages to be the best by far. They allow extreme precise control over concurrency on the same machine (be it single-threaded or multi-threaded), better than any other paradigm I've used (including actors for example). My preferred language here is Scala, but others are doing really well too.
I wish I could run Scala on the BEAM, since Akka (actors on the JVM) are just not nearly as good as the BEAM.