I guess you could use something like this:
def main():
    import arcpy
    
    fc_out = r'C:\GeoNet\RectangleBlocks\data.gdb\result01'
    sr = arcpy.SpatialReference(2276)  
    x_start = 2523853.5  
    y_start = 7124354.1  
    rect_width = 10.0
    rect_height = 5.0
    num_blocks_h = 6
    num_blocks_v = 5
    num_rect_in_block_h = 4
    num_rect_in_block_v = 8
    spacing_h = 3.0
    spacing_v = 3.0
    rectangles = []
    
    for block_h in range(num_blocks_h):
        for block_v in range(num_blocks_v):
            
            for rect_h in range(num_rect_in_block_h):
                for rect_v in range(num_rect_in_block_v):
                    x_min = x_start + block_h * spacing_h + block_h * num_rect_in_block_h * rect_width + rect_h * rect_width
                    y_min = y_start + block_v * spacing_v + block_v * num_rect_in_block_v * rect_height + rect_v * rect_height
                    x_max = x_min + rect_width
                    y_max = y_min + rect_height
                    rectangle = CreateRactangle(x_min, y_min, x_max, y_max, sr)
                    rectangles.append(rectangle)
    arcpy.CopyFeatures_management(rectangles, fc_out)
def CreateRactangle(x_min, y_min, x_max, y_max, sr):
    coords = [[x_min, y_min], [x_min, y_max], [x_max, y_max],
              [x_max, y_min], [x_min, y_min]]
    return arcpy.Polygon(arcpy.Array([arcpy.Point(*coord) for coord in coords]), sr)
if __name__ == '__main__':
    main()
Which results in:
