Unfortunately there are no shortcuts when it comes to rotation. When an image is drawn, we have to include the full affine transform matrix that defines how it is drawn. You can avoid the GC by not saving the transform (which does indeed make a whole new Transform object) but by just undoing the changes you made after drawing the image:
surf.translate(x, y);
surf.rotate(angle);
surf.drawCentered(texture, 0, 0); // I assume you want 0, 0 here because you already translated to the origin
surf.rotate(-angle);
surf.translate(-x, -y);
That will just make the needed changes to the Surface's current transform, do the draw (which adds the image to an accumulating batch of graphics calls, saving the data from the current state of the transform matrix along with it), and then undoing those changes. So you're back to where you started and did no allocations (other than potentially those associated with the drawing batch, but batches also auto-expand (and then reuse) their internal buffers to try to avoid allocations every frame).
You can of course make a helper function to do this, but Surface itself tries to be fairly low-level and doesn't have a zillion helper functions that accomplish every combination of scaling, translating and rotating that you might want to do before rendering an image.