I do make separate threads when necessary (e.g. to encapsulate blocking I/O).
It can approximate an Erlang experience.
But with a lot more boilerplate and lack of good actor library patterns.