Max Baud Rate for Arduino Uno

If you change the crystal frequency on either chip you will run into problems, and need to modify the firmware of both chips. Also, don't worry about 0% error, none of the standard baud have 0% error. Most UARTS can tolerate a certain amount of error. Ideally UARTs sample bits in the center of the bit. They align themselves at the beginning of the start bit. You can calculate how much shift should be tolerated in a standard 10 bit RS232 'byte'.

First, if you are using the Serial.begin(baud) function, you are asking for trouble with the different crystal on the Atmega 328. The Arduino environments assumes a 16MHz clock. By changing the crystal, you change the baud that is calculated.

Second, if you change the xtal on the Atmega8 (which if I read correctly, is what you did), you are messing up the USB timing. USB requires a specific freq that is generated by a PLL. You would have to change the firmware on the Atmega8 to modify the PLL settings to generate a correct clock for USB.

Third, FTDI is an interesting thing. USB does not work like serial. The host must poll the device at a given interval. If the buffers on the FTDI chip are full before the device is polled, things stop working. I have a write-up on my blog about FTDI latency and stuff.