Using the texture coordinates would be faster, because you don't have to create a new texture for that -- OpenGL does that internally and very efficiently.
Concerning SPGLTexture: in reality, you're always working with that kind of texture -- it's just handled by Sparrow behind the scenes, so you don't notice.
SPGLTexture has the limitations that every OpenGL texture has: it's width and height must be a power of two. If you load an image that adheres to those limits, then you'll get an SPGLTexture right away:
SPTexture *texture = [SPTexture textureWithContentsOfFile:@"image_64x64.png"];
// -> texture is a SPGLTexture
However, when you load a texture that has no power-of-two sides, then you'll get an intermediate class, SPSubTexture, instead:
SPTexture *texture = [SPTexture textureWithContentsOfFile:@"image_50x50.png"];
// -> texture is a SPSubTexture
Internally, this sub texture still has a reference to a SPGLTexture -- one that was created internally and has power-of-two side-lengths the image fits into. The subtexture just stores the information that it wants to display the top-left 50x50 rectangle of this texture.
So, in summary: you always work with a SPGLTexture, but sometimes it is wrapped in an SPSubTexture.
I hope I could explain it understandably 😉