Gladbach twice pulled ahead through Martin Stranzl and Luuk de Jong in the 44th and 58th minutes but Leverkusen equalised through Sidney Sam in the 52nd minute and Stefan Kiessling on the hour.
Andre Schurrle gave Leverkusen the lead for the first time in the 64th minute only to see Herrmann equalise for Gladbach four minutes from time.
Leverkusen moved to 38 points, one behind second-placed Dortmund, while Gladbach inched up to 30 in the fight for European qualification.
Leverkusen were the more attacking team early on, with Gonzalo Castro shooting just wide in the second minute and Schurrle's attempt sailing just over the bar a minute later.
Lars Bender could not beat Gladbach keeper Marc-Andre ter Stegen one-on-one in the ninth minute and Kiessling was denied a penalty after a questionable tackle by Stranzl on the quarter-hour mark.
Leverkusen put the ball in the goal in the 35th minute but Schurrle's strike was disallowed for offside.
Gladbach's first chance came in the 44th minute and brought the opening goal as Havard Nordtveit's corner from the right side was turned in by Stranzl with his shoulder.
Leverkusen did not wait long to equalise as Sam had plenty of space to strike a left-foot shot from the edge of the area after Schurrle and Kiessling drew the defence.
Gladbach regained the lead in the 59th minute with Juan Arango crossing from the left and de Jong heading home from 10 yards out.
Leverkusen equalised again a minute later when Sebastian Boenisch crossed from the left to a wide open Kiessling, who pushed home his 100th Bundesliga goal.
And the visitors took the lead for the first time in the 64th minute with Castro playing a through-ball to Schurrle, who finished into the left corner.
But Gladbach found an equaliser from a late set-piece, with Roel Brouwers getting his head on Arango's free-kick before Herrmann headed home from less than a yard out.