The usual method to do this is to use pulse-width modulation. The idea is that you subject the DC motor to the full operating voltage, but limit the duty cycle. The larger the duty cycle, the faster the motor turns.
If you control a DC motor using a linear regulator, then the motor has problems starting at slow speeds under load. This is because the reduced voltage is limiting the motor's torque. Since more torque is needed to overcome the initial friction, you get motors that either stall or start with a jerky nature.
The pulse-width modulation is best done with a microcontroller. That way you can tailor the parameters to the motors you are using. For example, you may need a very high duty cycle for a couple of milli-seconds to get the motor going before ramping back to the required duty cycle.