It turns out that since version 2.1, GDAL has the ability to reproject vectors in gdal.VectorTranslate. It would be great to see if there are any advantages to using the built-in function and whether it's more performant than what we have been doing in pygeoprocessing.