I've run into this problem as well. My solution, which I can personally recommend, is to use the purpose package.
It allows you to dedicate specific windows to specific "purposes" which each have user-configurable associated modes; for instance, the edit purpose might have prog-mode associated with it, the view purpose might have `info-mode associated with it, etc. Any time a new buffer is to be opened, if there is a window currently dedicated to that purpose, Emacs will force said buffer to be opened in that dedicated window.
As an example, my default Emacs "workspace" consists of one large edit window, one comm window for IRC, and two admin windows -- one for RSS and another for email.
Highly recommend.