In theory you can make everything pure. Only in some cases it can become very cumbersome and massively increase the complexity of your code.
For example if you are working with low level sockets where you want to read and write data without going through the entire ceremony of IO monads (also from a performance perspective, function calls aren't free). Or just IO in general, working with a file system is a lot simpler when you can just put imperative calls underneath each other. (3D) render engines is another case where FP can be pain in the ass if you push it too far.