Two approaches would be to have something (think cheat engine, artmoney, emuhaste) reach in and grab text or have the emulator punt it out (many emulators have lua support for a reason). You might also want to poke around some disabled/blind gamer forums as they have some options here (if you can read high contrast large text rather than grey on dark/faded graphics for a device that considered 240 vertical pixels an acceptable resolution...).
As you surmise most old games have their text handled very differently, and newer ones still do (though in later devices they lean into standard encodings more and might not have to jump through quite as many hoops to display all the characters they want -- waste a couple of kilobytes on a DS game and nobody cares, waste a couple on the NES and it is a big deal). Even games with identical encoding but one does auto new line and another needs new lines dictated would necessitate enough of a different approach that all talk of generic approaches becomes almost meaningless (or is by the time you add in formatting, punctuation, graphical effects, line positioning options, placeholders, calculated values and prebaked options -- the yes/no box often being a value, names may also be).
You can still do something. Indeed give me a game and if I have made a text spitter program before then I will probably have that sorted more quickly than I will have a useful dump of the text, and if I don't it is mainly because some late stage part of the game did something odd that I did not catch if I only used earlier parts/an incomplete playthrough.
In general then you would either have your external program monitoring a place it knows the text will be loaded in and decoded in or your internal lua script doing the same. Anything that happens there will be noted, decoded with a table you previously made, any relevant handling/formatting taken care of as well and spat out into a readable format in something else.