Displaying Characters In Verilog With VGA
Ultimately you will have to send pixel data to the display.  There is no way around that; that's just how VGA works.  The monitor at the other end only understands frames, the FPGA will need to generate complete frames at the correct rate.  The simplest way to do this is to have a frame buffer that holds pixel data for the entire display.  This generally will require more memory than the FPGA will have internally, so that means your frame buffer will have to sit on an external memory.  

However, if what you intend to display has some structure, then you may not need a complete frame buffer.  For example, if you want to make a text-only display, then all you need is a character buffer that indicates what character to display at every position on the display, each position corresponding to a character-sized box of pixels.  Then you can build a 'mapping' between the characters in the buffer and the pixels on the display - a font buffer.  To generate a line of video, pull characters from the corresponding row in the character buffer, use that to index the font buffer, and then display the pixels that correspond to the particular row in the selected characters.  This would be a very simple text drawing pipeline.  It is possible to do something similar with sprites as well so you can do basic graphics without requiring a complete frame buffer.  Depending on the implementation, it can be more efficient to use a hardware sprite drawing engine since moving the sprite only involves updating the position in the drawing engine instead of rewriting all of the pixels that make up the sprite.