The issue with too much haste can be easily fixed with one line of code. This makes sure the calculated weapon delay doesn't go below 10 since the swing timer will never go below 1 attack per second.
In attack.cpp, Mob::GetProcChances, ~ line 3577 add the second line:
weapon_speed = ((int)(weapon_speed*(100.0f+attack_speed)*PermaHaste) / 100);
if(weapon_speed < 10) weapon_speed = 10; //Make sure the delay doesn't go below 10 since that's as low as the swing timer goes.
I've tested this locally with 500% haste and it keeps the proc chance from going below what it should be if you're swinging your weapon once per second while leaving it alone if you swing slower than that. I don't know the delays on all the epics, but I'd guess most people with epic 3.0+ are hitting the 1 second cap pretty easily from gear + spell haste, or even gear alone if they have a high level brawlers or ultimate charm.
I'm not sure which rules you may have modified in the most recent changes, but there's two ways to go.
1) Add the above code, leave Combat:AdjustProcPerMinute enabled, and tweak Combat:AvgProcsPerMinute to find a good balance.
2) Disable Combat:AdjustProcPerMinute which bypasses weapon speed completely so the above code isn't necessary, and tweak Combat:BaseProcChance to find a good balance. The default is 3.5% + applicable bonuses.
If you log in and type "#mlog setcat combat on" you will get the proc chances and other combat stats dumped into the zone log so you can see the percentages as you tweak.
#rules reload is helpful when you're tweaking things on the fly so you don't need to keep restarting the server for them to take effect. You can also change rues using the #rules command, but I find it easier to tweak them in a database editor and reload them since that is less typing.
edit: changed code to ensure it will compile on Linux as well as Windows due to the annoying way max is defined in windows.h