England captain Harry Kane scored the only goal at the Allianz Arena, where last season's Champions League finalists were comfortably the better side for long periods.
Marcelo ... noooooo! pic.twitter.com/4HdnVNLZWZ— ESPN FC (@ESPNFC) July 30, 2019
Zinedine Zidane will be hoping for an upturn on the field soon as the Gareth Bale saga rumbles on.
Madrid, who begin their LaLiga campaign at Celta Vigo on August 17, lost to Bayern Munich and drew with Arsenal before their recent trip to the United States concluded with a chastening 7-3 reverse against rivals Atletico Madrid.
Los Blancos might have suffered a similarly painful first half if not for the efforts of Keylor Navas, who got down sharply to prevent Raphael Varane from turning Danny Rose's cross into his own net.
Stops from Erik Lamela and Tanguy Ndombele followed in quick succession, only for Marcelo to thank his goalkeeper by inadvertently playing Kane through on goal for a cool 22nd-minute finish.
Karim Benzema volleyed over as Zidane's men looked for a response but Spurs continued to dominate until the interval, with Navas thwarting Kane following an excellent Lamela pass.
Madrid were unchanged at the break and were comparatively more fluent than Tottenham after the restart, Eden Hazard having a goalbound shot blocked.
Son Heung-min and Kane were the only Spurs players to remain and the former forced Navas to push a fine 25-yard effort away from his top corner.
Madrid stuck to their task and Rodrygo thought he had an equaliser 15 minutes from time – bundling past Hugo Lloris from close range before seeing the flag raised for offside.
Highly touted youngsters were to the fore on both sides in the closing stages, as Madrid's Japan teenager Takefusa Kubo blasted just wide before Spurs' Troy Parrott hit the base of the post.
Each team will be back in action on Wednesday, with their opponents dependent on the outcome of Tuesday's other semi-final between host Bayern Munich and Fenerbahce.
Spurs then host Inter in the International Champions Cup before opening their Premier League schedule at home to newly promoted Aston Villa.