From the moment when I started using Flyspell, it always was painful to use. I rarely check entire buffer for misspelled words, usually I type and once I see underlined word I want to correct it instantly and continue typing. This is simply because I fear to forget to correct the word later and because when I start comprehensive checking of buffer, iSpell gives too many false positives. So, almost always I correct words as soon as possible while I type.
Here is built-in functions I know about and reasons why they are not efficient (for me):
flyspell-correct-word— This is bound to mouse click. Forget it, I'm not going to use mouse.
flyspell-correct-word-before-point— I used it for some time. It has two downsides:
By default it shows GUI menu that is difficult to operate without mouse and it's really cumbersome when you have list of corrections with more than 10 items.
It doesn't work for word long before point. I type fast and when I spot misspelled word I typically have one or two words between the misspelled word and point. I need to move point, correct word, return back. Oh.
flyspell-auto-correct-word— See point 2 ↑ plus it doesn't work well when you have long list of completions (because of cycling).
Q: How can I use Flyspell efficiently, with keyboard, being able to choose from list of completions without cycling, and with ability to correct even more or less distant words?
Acceptable answers include packages that help to navigate to previous misspelled word, correct it and get back or something like that as well as little snippets, possibly from your own configuration file, since I believe other people figured out their ways to efficiently interact with Flyspell.