I've heard over and over that this is not the right way to do it and I can understand why.
I can't. There is nothing wrong with driving an LED and its resistor directly from a processor pin. It is done all the time. As long as the current capacity of the pin is up to the job.
The Arduino has a reasonably low maximum drive current
No, in comparison with other processors it is very high.
a lot of TTL packages have poor drive current.
Source rating yes but they are much better at sinking.
The obvious way (to me) is to connect the LED through an NPN transistor, right? Connect the output pin through a 5K resistor to the base of the transistor (1mA current), connect +5V to the LED, through a 250 ohm resistor (20mA to the LED) to the transistor collector, connect transistor emitter to ground. Does that sound right?
Yes. Although you won't find many 5K resistors use 4K7.
If so, what is a good transistor choice?
The cheapest transistor you can get. Sights like Farnell allow you to sort them by price.
How do I know that 1mA on the base will give me at least 20mA from the emitter to the collector.
You look at the data sheet and see that the gain of the transistor you are using is at least 20.
I am not too familiar with discrete transistors.
Yes I know that from this:-
How do I know the transistor is open and not operating in the ohmic region?
No such region, do you mean saturated? It is down to the gain of the transistor.