Barty is correct that it is better to model the holes as part of the creation process, but Boolean can be used quite efficiently on existing models if you follow some simple guidelines.
1) Make sure that you apply the scale and rotation to both the object to be cut and the object doing the cutting. when these are note the same orientation, wierd things happen.
{CTRL+A} and select
{Scale and rotation to ObData}
2) Make 100% sure that both objects are manifold and that your Normals are facing the correct direction.
Check for manifold with
{CTRL+A:T+SHIFT+M}
Recalculate Normals with
{CTRL+N}
3) Lastly. A great deal of the non-manifold issues caused by Boolean functions are due to too many edges being sliced and diced at the same time. For best results, try and make sure that the surface being cut is a singular face (Or as simplified as possible.)
If simplifying the mesh is too cumbersome, another method I have employed is manually making a hole this way:
Edit the object and select the vertices around where you want the hole to be the delete them. Now select the Vertices on the edges of the hole.
{ALT+RIGHT CLICK} then move the Datum (cursor) to the center
.{Shift+S} then
{Cursor --> Selection}. Now, go to the Editing panel
{F9} and then hit the button
[To Sphere] and choose
{100%} and it will make a perfect circle for you that you can extrude
{E} the edges to the depth you like, and then Extrude the edges closed.
{E} {ESC} {S) and hold
{CTRL} while you move you mouse in.
Like so: