The French outfit went through 5-4 on aggregate thanks to Mouctar Diakhaby's early goal in the Italian capital, with a Kevin Strootman strike and an own goal by Lucas Tousart proving not enough for the hosts.
Ajax overturned a 2-1 defeat from the first leg in Denmark to qualify at the expense of Copenhagen, progressing 3-2 on aggregate thanks to a goal from Bertrand Traore and a Kasper Dolberg penalty right on half time.
The all-Belgian tie between Genk and Gent was almost a foregone conclusion ahead of kickoff, with the former leading 5-2 from their away leg. They finished the job with a 1-1 draw in front of their home fans, with Timothy Castagne on target and Louis Verstraete netting a consolation on the night.
Schalke 04 scraped into the quarters in their all-German showdown against Borussia Moenchengladbach, progressing on the away goals rule following a 2-2 draw.
Moenchengladbach opened up a two-goal lead through Andreas Christensen and Mahmoud Dahoud, but second-half strikes from Leon Goretzka and Nabil Bentaleb - the latter's coming from the penalty spot - saw the tie finish 3-3 on aggregate.
Belgian side Anderlecht saw off APOEL Nicosia of Cyprus 1-0 having beaten them by the same scoreline in the away leg, while Manchester United edged through 2-1 on aggregate against Rostov after beating the Russians 1-0 at Old Trafford courtesy of a Juan Mata strike.
Results in full: Besiktas 4-1 Olympiacos, Krasnodar 0-2 Celta Vigo, Genk 1-1 Gent, Ajax 2-0 Copenhagen, Borussia M'bach 2-2 Schalke, Man Utd 1-0 Rostov, Roma 2-1 Lyon, Anderlecht 1-0 APOEL