A lot of simple things can mess your map up. Such is the source engine. improper cubemaps is one of these simple problems that pretty much destroy the map if they aren't properly utilized, and I don't want to go into too much detail about that.
Optimizing is basically making players have better framerates during gameplay. Everyone knows that yea?
Ways of doing this in the source engine are as you said adding nodraw textures to certain surfaces to speed up both compiling and rendering ingame. Others include visleafs and level of detail.
Visleafs are implemented in many other games but source is very lacking in how well its simulated and such. Often the compiler will make mistakes and mess up these visleafs so creating references in hammer can solve these problems. A variety of entities and tool materials are used.
Another way for optimizing are lod's.
Often very complex models with a high number of polys can cause performance problems. Take for example perhaps a model of a train in a field.The modeler isable to create different versions of the model to produce lower "resolutions" of it. Basically lowering the amount of polys used. This reduces the load ingame and despite being far away the model can still look fairly realistic but can appear very detailed when the player moves right up next to it. These different distances in which the model may "switch" between lods can be defined through the entity in hammer or just the base source code. This tactic is used for pretty much every game coming out.
These different ways summarize the more major parts of optimization omitting texture resolution lods and other video card settings.