Brian,
I think you'd be amazed at how many "hand" calculations are still done in industry, assuming you mean using a calculator since very few people own tables of logarithms these days

. Most designs are the result of rules of thumb and design guidelines passed down from people who've figured out what works in the first place. The useful design rules tend to be simple enough to calculate by hand so you can quickly check a component value and see if it is about right. A lot of designs are a result of applying basic design rules for biasing and impedance matching followed by a bit of tweaking to meet specific design specs. This often proves easier than going through all the trouble to build an ACCURATE circuit model (no trivial task even for "simple" circuits, especially at higher frequencies) then spending big bucks for a software package and training in how to use to optimize the circuit values. Even when you do a full optimization you may find that the optimized circuit is only slightly better than the one based on design rules and tweaking (depending on the skill of the designer).
Optimization has its place, but trying to substitue it for well established design rules and the experience to tune up a circuit "by hand" will often waste time and resources and sometimes result in disaster since the results are only as good as the mathematical model you optimize and it's easy to overlook things when you are just punching in equations and reading out component values.
As for the specific discrete optimization problem you mention there are numerous techniques, none of which work very well in all cases. The general procedure might go as follows:
Given a particular circuit optimize power consumption for a specific input waveform.
Your constraints might include:
A given Vcc
discrete ranges of component values for all resistors and capacitors
A minimum desired gain
A maximum allowable gain
Some distortion criteria or signal to noise ratio
1. You would then simulate (or breadboard) your circuit and see how it operates with initial component values.
2. You vary component values according to your constraints and look for improvements
3. Based on whatever optimization methodology you are using you decide what the "best" set of component values should be based on the effect of individual variations
4. You apply the new component values and check to see if the circuit has "improved"
5. If the circuit has improved you adopt the new component values and go to step 2
6. If no improvement you can do one of the following:
a. stop because this is as good as it gets
b. revert to the initial values and try a different method of picking which component value changes to apply (change your optimization algorithm)
c. increase the amounts you are changing the component values by since you didn't change things enough to make a difference and go to step 2
One problem is that optimizations don't always converge so you can end up improving things by changing one value only to undo that effect somewhere else. If you have a reasonable number of discrete component combinations you can just try all the combinations and pick the one that works best. Provided your initial values, constraints and goal functions are reasonable this should work but it may take a while to test every possible combination of component values, even if you have a fast computer. Otherwise, for discrete optimization problems anyway, there is no guarantee you will end up with the best possible answer.
There is a lot of stuff on the web about optimization, you might want to look up "discrete optimization algorithms" as a start.
Max L.