Defender Wes Morgan had pounced in the 86th minute to put Billy Davies' side ahead in a bad-tempered encounter.
But, before they could dream of victory, Robins striker Haynes struck to earn the battling visitors a point.
The result still extended Nottingham Forest's unbeaten run to eight matches, but that will have been little consolation to manager Davies, who will have felt three points were within his side's grasp.
The game began in robust fashion with Nicky Maynard fortunate to escape with a yellow card following a crunching, late challenge on Chris Gunter after only eight seconds.
But Gunter - and Forest - recovered to make a bright start, carving out several opportunities as City struggled to cope with the home side's pace on the counter-attack.
Radoslaw Majewski slid in Paul Anderson down the left, but Dean Gerken was alert to the danger and smothered the ball, racing off his line.
Anderson came close again, this time as he attempted and narrowly failed to connect with a whipped in ball from Gunter from the right, at close range.
Bristol got away with their second bad challenge of the match as Dutchman Evander Sno went in high and late on Paul McKenna and could also have been punished with more than just the yellow card he received.
Forest were beginning to find chances harder to come by, with Garner coming closest when he lashed a 25-yard drive narrowly wide.
Marvin Elliott became the third City player to be booked, this time for persistent fouling, as they maintained their physical approach. While Majewski forced a smart save from Gerken with a vicious, dipping shot.
After the break, Bristol continued to tread a disciplinary tightrope, as Sno - who had already been booked - appeared to throw his arm into the face of McKenna. But referee Anthony Taylor decided a talking too was sufficient for the midfielder, who was quickly substituted by his relieved bench.
The match official's popularity plunged further in the eyes of the home supporters as he then booked Morgan for diving when the big defender had gone down in the box.
A storming run down the right from Gunter was completed with a fine ball to the far post, where David McGoldrick produced a poor header when he should have scored, while substitute Garath McCleary also came close with a low, rasping strike.
It then took an outstanding challenge from Cole Skuse to deny Anderson as the winger closed in on McCleary's outstanding cross towards the far post.
But Camp had to be on his toes at the other end to deny Elliott as he connected with a crisp header from a late corner.
It proved to be a key moment as, seconds later, Morgan pounced on a Cohen free-kick delivery into the box to lift a shot high into the net.
But then a City free-kick produced the same outcome, as Haynes pounced on a knockdown to smash home an almost immediate equaliser.