Run fast VIS: ('till the final seqence of compiles.) DRASTICALLY reduces compile times in most cases. Another thing I like about fast VIS, is that it will give you compile errors that Full VIS will not. In This way, you can eliminate/fix problem areas earlier.
"Func_wall" crazy shapes: Tying weird, non-square, rotated, overly VM'd brushes to func_wall will give VIS a big break, and again, DRASTICALLY reduce compile times. Doing this too much is not a good idea, because of the fact that brush-based entities are rendered pretty much all the time, so doing this too much will also raise r_speeds.
Because brush-based entiteds are rendered consantly, NULLing unused faces means a lot more, since normally, ZHLT isn't supposed to render unseen faces--though it isn't perfect. As a rule--and many people will disagree with this--, I NULL everything, except what is going to show.
Orpheus' comments are correct, and you should always do a "Full" compile in the final stages, and visblocking/avoiding large open areas are very important.