Regardless of the specific domain of an application (game or something else), whether design is bad or not is determined by how and in which ways you see the need for change in the future and how well that change can be realized while still satisfying all functional and non-functional (performance, memory-footprint, etc.) requirements of the application.
If you see change in trying to port to another platform: Well, then you’ve got to have a design that supports that.
If you see change in trying to use another renderer (Direct3D?): Well, then you know what your design ought to support.
In the classic IEEE article “Who Needs An Architect”, written by Martin Fowler, Ralph Johnson was cited with, that it is simple to make one thing easy to change in a software system. But we cannot make everything easy to change, as that would make the whole system very complex.
So, yes, it is always about compromises and architecture is really just the design decisions that make further anticipated changes easy to do.
There is also no such thing as “good” or “bad” design per se. Sure, there are loads of books about basic design principles out there. But those are meant to help design your application in a way that it is easier to adapt to common and recurring changes.
But in my opinion, the “quality” measure of design is defined by how well that design supports anticipated change.
You can write the crappiest code for an application/game; if the application/game works, and given it will never change again, it was by definition not bad design.
Design always “becomes” bad when you see change that is not easy to incorporate.