Thank you! It goes to show that taking a step back can lend some clarity. In the end, I had misdiagnosed my problem, but your example definitely helped.
The problem was in how I was re-writing the geometry. The major difference in my working script (below) and yours is that mine takes along all (an unknown number) of fields and writes them to the new geometry. I had been assigning the row[0].centroid coordinates to the SHAPE@XY token, but it was later overwritten by the shape value coming in with all fields ('*'). At least, I think that's what was going on...
# import libraries
import arcpy, os
# set input/output parameters
polyFC = arcpy.GetParameterAsText(0)
outCentroids = arcpy.GetParameterAsText(1)
# set overwrite environment
arcpy.env.overwriteOutput = True
# if the output file does not exist, create it. Add "ORIG_ID" field.
if not arcpy.Exists(outCentroids):
arcpy.CreateFeatureclass_management(os.path.dirname(outCentroids),
os.path.basename(outCentroids),
"POINT",
polyFC,
"",
"",
polyFC)
arcpy.AddField_management(outCentroids,'ORIG_ID', 'LONG')
# create an InsertCursor containing all the fields in ourCentroids, which are all the fields in polyFC plus "ORIG_ID"
cursor = arcpy.da.InsertCursor(outCentroids, ['*'])
# read all features in polyFC
for row in arcpy.da.SearchCursor(polyFC, ["SHAPE@",'*','OID@']):
# create an array to hold a new, modified row
rowArray = []
# read all the fields except "SHAPE@"
for fieldnum in range(1,len(row)):
# if this is the second field [i.e. SHAPE], replace it with the centroid coordinates
if fieldnum == 2:
rowArray.append(row[0].centroid)
else:
rowArray.append(row[fieldnum])
# write the new row to the cursor
cursor.insertRow(rowArray)
del row