The bus veered off the road and fell close to railway lines in the district of Mestre, which is connected to Venice by a bridge.
The cause of the accident was unclear. Venice city councilor Renato Boraso said one line of enquiry was that the driver, a 40-year-old Italian who was among those killed, had been taken ill before the crash.
"It's an appalling tragedy, the city is in mourning," Boraso told Sky Italia television.
He said the coach had been carrying 40 passengers, of whom 21 had died and 18 were injured. The death toll could rise because several of those hurt were in a critical condition, he added. Venice's city hall said the injured people had been taken to nearby hospitals, with four in a serious condition.
Officials said the vehicle fell around 15 metres (50 feet) onto electricity lines and caught fire at around 7:45 p.m. local time (1745 GMT).
"It's an apocalyptic scene. I am speechless," Venice's Mayor Luigi Brugnaro posted on X, formerly known as Twitter.
Five of the victims were Ukrainians and one was German, said Venice's prefect Michele Di Bari, the local representative of the interior ministry.
The bus was also carrying passengers from France and Croatia, Italian news agency ANSA reported.
"The bus is totally crushed. The firefighters had difficulty getting a lot of the bodies out," Di Bari told Sky Italia television. He said two children were among the victims.