Momentum swung between the sides in a frantic encounter at RheinEnergieSTADION on Wednesday, with Germany coming back from a two-goal deficit.
Chelsea duo Timo Werner and Kai Havertz got those goals, cancelling out efforts from Mario Gavranovic and Remo Freuler.
Gavranovic's second – a thumping strike from close range – restored Switzerland's lead, though Gnabry's wonderful flick on the hour ultimately claimed a share of the spoils in Cologne, where Fabian Schar was sent off late on.
Manuel Neuer made a fine save to deny Xherdan Shaqiri in the fourth minute, but Germany's goalkeeper was picking the ball out of the net a moment later – Gavranovic looping in a wonderful header after the host failed to clear the resulting corner.
Germany succumbed again in the 26th minute. Toni Kroos, on his 100th cap, gifted possession to Switzerland, with Freuler lifting an exquisite finish over the onrushing Neuer.
A response was required and it came inside two minutes, as Werner caught Switzerland's defence cold with a crisp finish across Yann Sommer, and Switzerland's hard work was undone after the interval.
Having already struck the woodwork, Havertz pounced on Schar's slack pass and finished calmly beyond Sommer.
But parity was short-lived, and Switzerland retook the lead just under two minutes later when Gavranovic hammered home on the rebound following Neuer's save from Haris Seferovic.
Germany was not to be beaten, though, and Gnabry's brilliant back-heel from Werner's cut-back made it 3-3.
Kroos went close to capping his landmark with a winner when a free-kick sailed just wide, before Sommer denied substitute Julian Draxler, with Switzerland reduced to 10 in stoppage time when Schar received his second booking.