THe problem with the GFX libraries - and the newer U8x8 - is that often with the SPI TFT's, when they write a character, they draw individual pixels used, but ignore the white space around - so the character is printed on top of a background. This is often desired, but as you found out, also means you end up with a mess when its changing.
The options are to either just draw a rectangle where the characters are, with the background colour before re-writing a character, or modify the library to print a character with a fixed area (width and height) and foreground (character) and background colour.
The other annoying things about those libaries is, for almost every function they call "drawpixel" which sends the address off the pixel followed by two bytes of colour. The upshot is, every pixel requires several SPI writes, where-as the controllers have the facility to declare a rectangle using X1Y1 and X2Y2 where the address auto-increments and wraps around - making drawing rectangles very quick and simple. For most apps this doesn't matter, but it does mean that the above libraries are about 4x slower than they need to be.
Edit/update: Re: flickering. It appears thats because it takes time to "black out" the character, and a similar time to redraw the new character. This means the character flashes at pretty much a 50% duty cycle. I could be wrong but I think the only way would either be to speed up the display writing - either faster SPI or a faster MCU - or slow down the display update.