By passing vertices to the GL window:
Color sfml_color = color.GetColor();
_verts[0] = new Vertex(new Vector2f((float)x, (float)y), sfml_color);
_verts[1] = new Vertex(new Vector2f((float)(x + width), (float)y), sfml_color);
_verts[2] = new Vertex(new Vector2f((float)(x + width), (float)(y + height)), sfml_color);
_verts[3] = new Vertex(new Vector2f((float)x, (float)(y + height)), sfml_color);
Target.Draw(_verts, PrimitiveType.Quads);
_verts is a static array that gets overwritten by new vertices each time you ask to draw a primitive. It is then sent to the GPU with Target.Draw. It's similar to doing:
glBegin(GL_QUAD);
glColor4f(r, g, b, a); // rgba components of sfml_color
glVertex2f(x0, y0);
glColor4f(r, g, b, a);
glVertex2f(x1, y1);
glColor4f(r, g, b, a);
glVertex2f(x2, y2);
glColor4f(r, g, b, a);
glVertex2f(x3, y3);
glEnd();
Except made a bit more flexible since I use an array. I can pass just 2 points for a line, and 3 for a triangle. But a GL display list could be used to cache these on a lower-level (which I can't do in SFML). It might make it go faster... or not, display lists seem to be only useful for static objects. But they can be scaled, transformed by manipulating the matrix stack, etc, but then again that's primitives. A GL display list doesn't help sprite batching all so much.
Come to think of it... I should add primitives to the sprite batch too (making sure I draw those in order with textures in code, too).