|Think about Loose Coupling|
The first rule (or at least an important one) of software engineering is that a complete rewrite is never as good an idea as it seems.
You are correct to be concerned about making any moves that lead to a complete rewrite.
Look for ways that you can work these ideas in edgewise, at the margins. Move code around, change what happens behind the scenes, but keep the interfaces the same.
Having everything going through those 4 modules may be what makes it possible to change.
I'm willing to take a look at your Base::* modules and see what I think is reasonable to target for refactoring.
For example, to use my suggested approach for menus, you can start by changing your existing print_menu() in Base::Menu.
These steps don't require a rewrite, and at each part of the process you never have a broken website.
Also, while it may have taken you several years to get where you are now, most of that work was not in the production of code, but rather, the acquisition of the knowledge required to produce the code.
I think you may find that a better architecture will pay off handsomely. A good structure will come together with much less effort than a patched one.
BTW, don't worry too much about UTF-8 until you need it. I haven't needed to worry about it, so I haven't bothered to learn anything other than the basics. I know that when I need to know, I will be able to find the resources I need to make it work. That is enough.