You have a few options I think. You can do it as a graphic with Image::Magick, Imager (not sure about this one), or GD; at least a couple of those support some font metrics stuff but I haven't used it (and I'm a former typographer) because it's very low level and not fun. You can use tables and they will line up correctly. You can use CSS which either uses the table style rules, uses overflow rules, or is dynamically written in ex widths and presented in a mono-space font. You could even use LaTeX and present a PDF or a gif/png of a generated PDF. Update: SVG could work too... but I think a text heavy page in it would end up being *huge*. And you'd still be stuck with generating it in a defined/fluid grid.
Of those I'd argue that the font based stuff is probably the last and most difficult option.