What Haskell did with Monads is nice, but eventually Monads are just tags on what functionality the function uses.
That being said, I like that Nim and Koka did exactly that. You just tag the functions (IO, Async, Whatever) and it works.
In Haskell, you need monad transformers (which have a runtime costs) or whatever else was made to allow you to work with multiple different effects.