They're important in CS theory, sure, but you sure don't want to encounter one in raw form lurking in a regular codebase. (Just like you wouldn't want to encounter monadic IO in raw >>= form.)
do stuff <- getLine
putStrLn stuff
but the stuff variable is then unnecessarily introduced. You could instead just write getLine >>= putStrLn
or the flipped version if you want it to read more like function application putStrLn =<< getLineYes I would. I would much rather see "getLine >>= putStrLn" than a 2 line do block.