My limited confirmation between arcpy and numpy calculations of centroid and area for multiple part/ring features suggest that the 'shoelace' (aka area weighted) method is used for area. This is also used in the ArcGIS module. The centroids do differ and don't seem to follow an area weighted method. In python/numpy, the location of the rings relative to the outer ring seems to have no bearing, nor does the convexity/concavity of the shape. It would be conjecture at this point to specify what actual approach is used to determine what is meant by 'centroid' in arc* parlance for moderately complex shapes. Perhaps someone from the originating arcobjects definition team would weigh in.
shapes can be seen here
/blogs/dan_patterson/2019/04/17/geometry-reconstructing-poly-features-4
SR = getSR(in_fc0)
shapes = fc_shapes(in_fc0)
[(p.centroid, p.area) for p in shapes]
[(<Point (300005.0, 5000005.0,
(<Point (300005.0, 5000011.0,
(<Point (300019.70967741933, 5000009.941935484,
(<Point (300015.0, 5000011.0,
(<Point (300022.5, 5000006.2084,
(s0.centroids(), s0.areas())
(array([[ 5. , 5. ],
[ 4.26, 13.77],
[19.46, 9.82],
[14.08, 15. ],
[25. , 5.3 ]]), array([100., 78., 155., 52., 36.]))