It’s always been said in tutorials that i2c is faster than uart because it uses synchronous communication. But isn’t it possible to just make a very large baud rate for UART so that it can beat a high clock frequency of an i2c?
You are reading the wrong tutorials, because the I2C bus is slow. In normal mode it is standard 100 kHz to 400 kHz and Arduino uses 100 kHz. Because of overhead it could be 8 kbyte per second, but I doubt if that is possible.
When two Arduino boards are communicating over I2C, then I think it will be very hard to achieve 1 kbyte per second data transfer.
The software overhead for I2C is large with the Arduino Wire library. It is not so large with the Serial library.
Serial communication is full duplex, the I2C bus is not.
The (very) old standard of 9600 baud is about 1 kbyte per second of data.
The often used 115200 baud can be 10 kbyte per second.
It can be set higher, but the older Arduino boards (Arduino Uno) have a buffer of just one byte for the incoming serial data. Because of that, an interrupt must be handled for every byte.
Between the computer and the Arduino is a different story. The Arduino Leonardo and Arduino Zero/M0/MKR boards have a native USB port which uses a CDC device inside the processor. The baudrate is not really used and the data via Serial is going very fast over the USB connection.
Why do you want to know this ? A Arduino Uno has limited memory, so it can not deal with large amounts of data. To transfer a lot of data, you can take two ESP32 or Raspberry Pi boards and use Wifi.
This is a question of time and technology. It is true that I2C is faster than UART if you look at old technology. The limiting factor was that a UART does not have a clock signal. So, slow mikrocontrollers could not sample the UART line often enough to recreate the signal properly when the baudrate was too high.
With faster technology UARTs can be run at much higher speed. But now I2C runs into another issue. Because the signal is not driven high actively by a transistor but by a pull-up resistor the signal speed is limited. This was done to save a wires, the lines are bi-directional. If the signal would be driven high by both sides the driving transistor could be damaged. When I2C wants to send a high bit it just lets the pin float and the resistor pulls the voltage up.
When you look at SPI you can see there are separate lines for data in and out and a clock signal. That allows SPI to be faster than UARTs or I2C, but it needs more wires.
And then there are more modern buses like USB as Koepel explained. They are a lot faster but need much more complicated signal conditioning electronics in silicon. But because the manufacturing technologies are a lot smaller now, they can be implemented in cheap micrcocontrollers.