Watson threw a 10-yard touchdown pass to Elijah Moore with 8:57 remaining. Then one of Lamar Jackson’s passes caromed high into the air and was picked off by Greg Newsome II, and he returned the interception 34 yards for a TD just 41 seconds later.
The Ravens stayed ahead 31-30 because Hopkins missed the extra point, but Cleveland got the ball back and drove 58 yards for the winning kick. The key play was a 17-yard pass to Amari Cooper on second-and-19 that got the drive back on track.
Baltimore (7-3) had a four-game winning streak snapped, and the victory by Cleveland (6-3) tightened the race in the AFC North significantly.
Watson got off to a terrible start — his first pass of the game was picked off and returned for a touchdown — but he finished with 213 yards passing and 37 rushing, and his elusiveness was an issue for Baltimore’s vaunted pass rush.
Despite the high score, the defenses — ranked No. 1 and 2 in the league entering the game — had their moments. On the second play from scrimmage, Watson’s pass was batted into the air by Kyle Hamilton, and the ball came right down to the Baltimore safety, who ran 18 yards for a TD 40 seconds into the game.
Keaton Mitchell, an undrafted rookie who had no NFL carries before rushing for 138 yards on nine attempts the previous week against Seattle, scored on a 39-yard run on his first touch against the Browns. That gave Baltimore a 14-0 lead less than five minutes in.
It was 17-9 at halftime, and the Ravens scored on their first possession of the second. Odell Beckham Jr., who played for Cleveland from 2019 until a drama-filled exit in 2021, caught a pass over the middle from Jackson and outran everyone for a 40-yard touchdown.
The Browns then went 75 yards on 17 plays and capped the drive — which lasted more than 10 minutes — with a 3-yard TD run by Kareem Hunt. Watson ran for a 2-point conversion that made it 24-17.
The Browns were about to get the ball back when ex-Raven James Proche committed what seemed like a devastating gaffe, fumbling a punt to gift Baltimore possession at the Cleveland 12.
A holding call on the Browns on third down kept that short drive going. Then Baltimore had a touchdown called back for holding. Jackson appeared to have thrown an interception in the end zone, but another holding call on Cleveland negated that.
Gus Edwards finally scored on a 1-yard run to make it 31-17. It was far from over.
The Browns not only pulled within a half-game of the Ravens in the standings, they also avoided a series sweep after losing 28-3 to Baltimore earlier this season when Watson was hurt.
It was a bruising game between division rivals. Cleveland was without both starting tackles from the outset. Browns CB Denzel Ward left with a neck injury, and S Juan Thornhill hurt a calf.
Baltimore T Ronnie Stanley exited with a knee injury, and CB Marlon Humphrey went down with an ankle problem. LB Trenton Simpson of the Ravens was evaluated for a concussion.
Browns: Host Pittsburgh next Sunday.
Ravens: Host Cincinnati on Thursday night.
Steelers at Browns, 1 p.m., CBS, 1290, 95.7