The match ended 1-1 after extra time before La Roja won 3-1 on spot-kicks.
Spain were ahead after just eight minutes with their first shot on target.
A corner was cleared to the edge of the Swiss box to Jordi Alba who saw his shot his Denis Zakaria to wrongfoot Yann Sommer on it’s way into the bottom left corner.
Torres was lively throughout the remainder of the first-half, with Laporte rarely troubled at the back.
But if the Swiss were disappointing before the break, they were much-improved after it.
They levelled on 68 minutes when Laporte raced across to clear danger but his clearance hit Pau Torres and bounced into the path of Xherdan Shaqiri who tucked a low shot into the bottom left corner.
CITY+ | SUBSCRIBE TO ACCESS EXCLUSIVE CONTENT
The balance tipped Spain’s way again on 78 minutes when Switzerland’s Remo Freuler was shown a red card by Michael Oliver for a dangerous challenge on Gerard Moreno.
The Spanish created little in the remainder of normal time, Torres was replaced on 90 minutes by Oyarzabal, with the Swiss forcing an extra 30 minutes to decide the semi-finalists.
In a rear-guard action, it was pretty much one-way traffic in extra time with Sommer saving his side with two excellent saves in the opening period.
Rodrigo was introduced for Pedri a minute from the end of the match and even had a last gasp header go over - but overall, Spain’s poor finishing and Sommer’s form led to a shoot-out.
It was hardly a penalty masterclass as both sides missed two of their first three spot-kicks - Rodrigo among the unsuccessful attempts - before Spain edged home 3-1 and into the semis where they will face either Belgium or Italy.