Dortmund raced into the lead at the Mercedes-Benz Arena as Marco Reus netted a fifth-minute strike.
Shortly after Dortmund fans had ended their boycott of the first 20 minutes in protest against ticket prices, Stuttgart levelled matters courtesy of a deflected effort from Lukas Rupp.
The protests continued minutes later with Dortmund supporters throwing tennis balls onto the pitch, forcing the game to be briefly stopped.
READ MORE | Dortmund fans stage tennis ball protest
But Pierre-Emerick Aubameyang's 30th goal in 31 games and Henrikh Mkhitaryan's late effort made sure of a place in the last four as Dortmund ended Stuttgart's five-match winning streak.
"In the situation of the opponent, in these circumstances, we have made a perfect game," Tuchel said.
"It was a great game, it was a great game to coach. It was as intense as expected.
"We were dominant in the first half and prevented early counter-attacks.
"In the second half it was a little more open, we allowed three of four chances on the break.
"We could have made the third goal earlier, but we did so under difficult conditions."