VVIS is usually the cause of unreasonably long compile times. When you compile your map,
VBSP splits up space into visleaves, and
VVIS compares which visleaves can see each other. If a lot of visleaves can see each other, then it takes longer to complete its job. By reducing the number of visleaves (by converting insignificant world brushes into func_detail or replacing them with props) you can cut down VVIS time, but you can also reduce the chance for leaves to see each other by using buildings, cliffs and corridors to isolate areas and obscure sightlines.
In order to make effective design and vis-opt decisions, you really need to understand how visleaves are created and how visibility between them is calculated. There are a number of guides available to introduce you to the vis-opt toolset. It's going to take some time to understand it, so don't worry if it seems like a lot of work.
Some example guides:
Touching on what Lampenpam said, if you want to see how VBSP will make its visleaves, you do a VBSP-only compile (no VVIS, VRAD or anything else), then load the default portal file (Map > Load Portal FIle). Study the blue boxes, looking for clusters of small ones, and see how many can see each other between large areas. Don't worry about visleaves that look messy and don't treat func_detail as a magic bullet. You should only be using it on very small brushes like steps and posts.