Is there a way to move the caret in a text box without using the hard keyboard and without a bunch of single touches?
This depends on the phone you're using, on my Spica, for example, I can use the directional keypad to adjust the position of the cursor. On phones that have trackballs, the trackball does the same job.

Otherwise, the backspace key can be used as a workaround for left-arrow key (delete a few chars, then retype the word you're inserting and retype the deleted chars.

Another alternative, if you're typing in English or in one of the supported languages, you can try Swype. Swype is a word-based text input (as opposed to character based), and you typically delete or swipe one word at a time and the correction mode (double tap on the word you want to correct and pick or swipe the new word) make correcting errors a breeze.