If I use a relate to select the features in the feature class I want to update and delete them, and then use the Append tool to insert the features from the source feature class, the geometry matches exactly. However, this changes the original ObjectIDs of the features in the updated feature class, which I wanted to avoid.
The features shown below that are semi-transparent blue with red outlines have the source geometry I want to transfer and features that are orange with grey outlines are the features I want to change before I have done any update.

The features shown below are the result of deleting the original features and using the Append tool. The geometry matches exactly, but the ObjectIDs have changed.

I have written several versions of a script designed to preserve the ObjectIDs and transfer the geometry in the Shape field of one feature class using an da.UpdateCursor from the Shape field in another that match on the values of another field using both a Dictionary populated by a da.SearchCursor and directly from a da.SearchCursor, but the geometry that is transferred is not the same as the source geometry. I have tried variations of the script that used or did not use the Spatial Reference parameter of one or both cursors, but that does not fix the problem.
The features shown below are the result of using a da.UpdateCursor to transfer the geometry. The ObjectIDs have not changed and the geometries have changed, but the transferred geometries are not identical to the source geometry.

Has anyone else experienced this and come up with a solution that both preserves the original OBJECTIDs and correctly transfers geometry that is identical with the source geometry?
Here is one of the scripts I tried. The script completes without error and the geometry of the updated feature class is being changed, but the output geometry is not identical to the source geometry as shown above.
<SPAN class="keyword token">from</SPAN> time <SPAN class="keyword token">import</SPAN> strftime
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Start script: "</SPAN> <SPAN class="operator token">+</SPAN> strftime<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"%Y-%m-%d %H:%M:%S"</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">import</SPAN> arcpy
desc <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">"Y:\GISData\rfairhur\Layers\Transform_Parcel_Layers\Transform_Parcel_Layers.gdb/ZONING_POST_DESERT_EXTRACT"</SPAN><SPAN class="punctuation token">)</SPAN>
sourceFC <SPAN class="operator token">=</SPAN> r<SPAN class="string token">"Y:\GISData\rfairhur\Layers\Transform_Parcel_Layers\Transform_Parcel_Layers.gdb/ZONING_POST_DESERT_EXTRACT"</SPAN>
sourceFieldsList <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'OIDLIST'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'SHAPE'</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token"># Use list comprehension to build a dictionary from a da SearchCursor </SPAN>
valueDict <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN>r<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">:</SPAN>r<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">for</SPAN> r <SPAN class="keyword token">in</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>sourceFC<SPAN class="punctuation token">,</SPAN> sourceFieldsList<SPAN class="punctuation token">,</SPAN> spatial_reference<SPAN class="operator token">=</SPAN>desc<SPAN class="punctuation token">.</SPAN>spatialReference<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">}</SPAN>
updateFC <SPAN class="operator token">=</SPAN> r<SPAN class="string token">"Y:\GISData\rfairhur\Layers\Transform_Parcel_Layers\Transform_Parcel_Layers.gdb/ZONING_POST_DESERT_CURSOR"</SPAN>
updateFieldsList <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'OIDLIST'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'SHAPE'</SPAN><SPAN class="punctuation token">]</SPAN>
count <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN>
desc <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">"Y:\GISData\rfairhur\Layers\Transform_Parcel_Layers\Transform_Parcel_Layers.gdb/ZONING_POST_DESERT_CURSOR"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>UpdateCursor<SPAN class="punctuation token">(</SPAN>updateFC<SPAN class="punctuation token">,</SPAN> updateFieldsList<SPAN class="punctuation token">,</SPAN> spatial_reference<SPAN class="operator token">=</SPAN>desc<SPAN class="punctuation token">.</SPAN>spatialReference<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> updateRows<SPAN class="punctuation token">:</SPAN>
desc <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">"Y:\GISData\rfairhur\Layers\Transform_Parcel_Layers\Transform_Parcel_Layers.gdb/ZONING_POST_DESERT_EXTRACT"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> updateRow <SPAN class="keyword token">in</SPAN> updateRows<SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token"># store the Join value of the row being updated in a keyValue variable </SPAN>
keyValue <SPAN class="operator token">=</SPAN> updateRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token"># verify that the keyValue is in the Dictionary </SPAN>
<SPAN class="keyword token">if</SPAN> keyValue <SPAN class="keyword token">in</SPAN> valueDict<SPAN class="punctuation token">:</SPAN>
expression <SPAN class="operator token">=</SPAN> <SPAN class="string token">"OIDLIST = '"</SPAN> <SPAN class="operator token">+</SPAN> keyValue <SPAN class="operator token">+</SPAN> <SPAN class="string token">"'"</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>sourceFC<SPAN class="punctuation token">,</SPAN> sourceFieldsList<SPAN class="punctuation token">,</SPAN> where_clause<SPAN class="operator token">=</SPAN>expression<SPAN class="punctuation token">,</SPAN> spatial_reference<SPAN class="operator token">=</SPAN>desc<SPAN class="punctuation token">.</SPAN>spatialReference<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> sourceRows<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> sourceRow <SPAN class="keyword token">in</SPAN> sourceRows<SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token"># transfer the value stored under the keyValue from the dictionary to the updated field. </SPAN>
updateRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> sourceRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN>
count <SPAN class="operator token">+=</SPAN> <SPAN class="number token">1</SPAN>
updateRows<SPAN class="punctuation token">.</SPAN>updateRow<SPAN class="punctuation token">(</SPAN>updateRow<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> count <SPAN class="operator token">%</SPAN> <SPAN class="number token">50</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Fixed "</SPAN> <SPAN class="operator token">+</SPAN>str<SPAN class="punctuation token">(</SPAN>count<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">" Zone Features: "</SPAN> <SPAN class="operator token">+</SPAN> strftime<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"%Y-%m-%d %H:%M:%S"</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Fixed "</SPAN> <SPAN class="operator token">+</SPAN>str<SPAN class="punctuation token">(</SPAN>count<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">" Zone Features: "</SPAN> <SPAN class="operator token">+</SPAN> strftime<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"%Y-%m-%d %H:%M:%S"</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">del</SPAN> valueDict
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN> <SPAN class="string token">"Finished script: "</SPAN> <SPAN class="operator token">+</SPAN> strftime<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"%Y-%m-%d %H:%M:%S"</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>