I had a system a long time ago where I averaged the BAB of all members of a unit, the damage profile of their weapons, their move speed, etc, then used 2d10 to estimate the damage dealt based on this. The 2d10 was compared to the armor class of the defending unit, with an exact hit result being 55% damage (based on total unit strength multiplied by average damage) and scaled up or down based on margin of success. Based on how experienced the unit was, they'd have a morale break at 20%, 35% 50%, or 65%. Damage taken in a minute would reduce the unit's effectiveness proportionately for subsequent checks, and at the end of a fight, 1/3 of the casualties taken by the victor and 2/3 the casualties taken by the defeated were fatalities. Large scale healing support could mitigate this; a single cure light wounds could prevent the death of 1 person, so a wand could save up to 50. The unit could be assigned experience based on how many times they attacked. Losses filled by green replacements lowered the average experience level, it worked surprisingly well for my purposes without slowing things down much, and gave me a benchmark to let the party know how the fighting was going.
Magical support was the hardest thing to handle; even ten 3rd level characters with Flaming Sphere could do appalling amounts of damage to large units. As such, I limited "magic support" units to 10% casters and the assumption that they all had the same spells memorized to cast them en masse.