While running Curse of Strahd, I had a problem: the PCs would often ally with NPCs to fight multiple monsters at once.
Now, as a DM, to roll dice for both sides of a conflict feels ridiculous and boring, even more so if some of the NPCs are average-level spell-casters, with spells and actions to choose from. And I can only imagine how tiresome it would be for the players to watch the DM rolling for a fight that doesn't involve them directly.
Of course, you could let your players control the NPCs on their side - which generally I recommend. But, TBH, the players are having a hard time with the number of options they already have, and this wouldn't help.
And I didn't want to handwave it, either. It was important to me if the NPC would survive the battle, and it was interesting to see if they would help the PCs or require help themselves.
Fortunately, there is an easy solution.
I call this the three-strikes rule. Works for lots of things.
In 5e, there are two things that encouraged me to use it.
First, death saving throws - they use a "three strikes" methods already.
Second, how damage and HP work in 5e. For many monsters, an attack deals about one third of a monster's HP in damage (I think I read this here; it isn't exact, but it works). This means that, in average... three hits, and you're out.
So, the solution is pretty simple: when a fight breaks, put the allied NPCs against inimical NPCs with comparable power, and roll a d20. Treat the results similarly to a death saving throw: three failures and the NPC is down, three successes and he is triumphant (and can help the PCs).
[If you want to be fair, a success should happen on 11 or more, but the difference is small]
If an NPC has a few failures but survives, he lost one third of his HP for each failure, and so on.
And if it is really important to save the NPC, well, the PCs can try - when the NPC is down, he starts rolling actual death saving throws.
This is scalable. If a paladin is fighting three goblins (assuming both sides are similar in power), each success means he killed one goblin. You could even use it for mass combat between two forces of similar power level. With a small list of modifiers (+2 for high ground, +4 if your force is twice the size of the other, -2 for each failure you already have, etc.), this is pretty much all you need for huge battles.
It also works for fragile NPCs that do not fight. They probably can not "win", but three failures means they're down. If one NPC is "guarding" another (which happened in my campaign), I might treat the two as a single entity and let the "bodyguard" fall first.
This method has a few advantages:
* You can roll a single die for both sides (success for one side means failure to the other). Inf act, I ask the players to roll for their allies.
* You can abstract all powers, wounds, attacks, etc. in a single roll.
It has a few difficulties, too.
For example, things get a bit complicated if the PCs team up with NPCs against a single powerful NPC. In this case, since you've got only one inimical NPC to manage, you're probably better off defaulting to the original system. And comparing the power of two different sides is not always easy.
But, overall, I find it better than playing each move by the book.
All these elements should be incorporated in the "narrative" of course. This assures the the NPCs power level becomes a bit more explicit. E.g., "when you find the fallen body of your comrade, you notice that there are twenty dead ORCS at his feet", and so on.