Several popular libraries I used threw exceptions for expected failures (like a non 2xx HTTP response) and required wrapping.
Even the standard prelude is full of partial functions. (head...).
I saw a wild mix of Either, exceptions and custom monads all over the ecosystem. So if you want to have a coherent strategy you end up doing a lot of error juggling.
Manual errors with Either can make it very hard to figure out where an error came from because they don't capture backtraces. So if you don't have a very specific error for each failure point you are left guessing and debugging.