BYOND really just works that way, Reelya. It's a bit like a single very very very big KSP mod. If you want to have a new sort of computer, you make it a subtype of the general computer class and override some procs to add your own code because that's how it works. The ongoing remake plans to make it not be like that but that's something else entirely.
Link to the repo.
And every separate function we declare counts to that limit, AFAIK. Hell, maybe overrides even count.
So it all adds up. You add a handful of functions here for nice OOPness, some overrides there, a few helpers. This game has over 300k lines of code.
Well looking at just one class/object, and for quick refactors that won't break anything. You can replace a multitude of helper functions for one class with a single action method, and pass it a set of flags, which tells it which action to take. You could even use 1 bit for each possible action, and use a single function call to execute multiple configuration options in one call, make the possible options as consts or enums or the BYOND equivalent so you can call them by name, but not need an actual function header for each one.
If you're really up against the wall with number of functions, then I'd say this sort of refactor is the only way forward. Longer term, I'd recommend trying to reduce the number of total classes needed, and have things more data-driven, I see a lot of hard-coded logic there. The trick is to make minor refactors that make two or more classes more similar in structure and data. Eventually, you hit a point where you can delete one, and remake it as a data-driven "mod" for an existing class, which reduces function overhead.
Do data polymorphism, not "hard-wired" polymorphism. The way you described it being done shouldn't really be necessary, in any language.
BYOND really just works that way, Reelya.
I'm usually skeptical of these claims. "shitty way is the only way that the language supports, and it's what we've always done" has never been accurate in my experience. Are you sure it's not your existing program structure rather than the language? Can't you e.g. modify the existing computer class to have an extra data field, and based on that it gets different behavior via "if" statements in the procs? That doesn't require you to use inheritance at all, or override procs. Technically, using data-polymorphism you can pack unlimited extra "types" into the same class with the same number of procs.
c++ also works that shitty way too, if you use it like that. But there's no good reason to do that, in byond or c++. if you remake the same data structures in c++ or any other language, it's still going to be the same pile of mud, and difficult to modify.