With OpenGL you simply must use power-of-2 textures for it to be compatible with everything. There are loads of cards/drivers that don't support anything else.
To make your example work, allocate a 1024x512 texture, put the 640x320 image in the top-left-hand corner using glTexSubimage2D, and then draw a quad with that texture, but setting the uv coordinates to
(0,0)
(640/1024),0 = (0.625,0)
(640/1024,320/512) = (0.625,0.625)
(0,320/512)
Best to turn off bilinear filtering first (use GL_NEAREST I think it is). You can use the spare bits of the texture for other smaller sprites.
Jim