How to control spacing/alignment of Label + Horizontal Enum Property?
Just set layout.use_property_split property in your draw method to True:
def draw(self, context):
    layout = self.layout
    layout.use_property_split = True
    layout.use_property_decorate = False  # No animation.
    ...


Custom Panel
Example based on the add-on template from: How to create a custom UI?

bl_info = {
    &quot;name&quot;: &quot;Add-on Template&quot;,
    &quot;description&quot;: &quot;&quot;,
    &quot;author&quot;: &quot;p2or, brockmann&quot;,
    &quot;version&quot;: (0, 0, 3),
    &quot;blender&quot;: (2, 80, 0),
    &quot;location&quot;: &quot;3D View &gt; Tools&quot;,
    &quot;warning&quot;: &quot;&quot;, # used for warning icon and text in addons panel
    &quot;wiki_url&quot;: &quot;&quot;,
    &quot;tracker_url&quot;: &quot;&quot;,
    &quot;category&quot;: &quot;Development&quot;
}


import bpy

from bpy.props import (StringProperty,
                       BoolProperty,
                       IntProperty,
                       FloatProperty,
                       FloatVectorProperty,
                       EnumProperty,
                       PointerProperty,
                       )
from bpy.types import (Panel,
                       Menu,
                       Operator,
                       PropertyGroup,
                       )


# ------------------------------------------------------------------------
#    Scene Properties
# ------------------------------------------------------------------------

class MyProperties(PropertyGroup):

    my_bool: BoolProperty(
        name=&quot;Enable or Disable&quot;,
        description=&quot;A bool property&quot;,
        default = False
        )

    my_int: IntProperty(
        name = &quot;Int Value&quot;,
        description=&quot;A integer property&quot;,
        default = 23,
        min = 10,
        max = 100
        )

    my_float: FloatProperty(
        name = &quot;Float Value&quot;,
        description = &quot;A float property&quot;,
        default = 23.7,
        min = 0.01,
        max = 30.0
        )

    my_float_vector: FloatVectorProperty(
        name = &quot;Float Vector Value&quot;,
        description=&quot;Something&quot;,
        default=(0.0, 0.0, 0.0), 
        min= 0.0, # float
        max = 0.1
    ) 

    my_string: StringProperty(
        name=&quot;User Input&quot;,
        description=&quot;:&quot;,
        default=&quot;&quot;,
        maxlen=1024,
        )

    my_path: StringProperty(
        name = &quot;Directory&quot;,
        description=&quot;Choose a directory:&quot;,
        default=&quot;&quot;,
        maxlen=1024,
        subtype='DIR_PATH'
        )

    my_enum: EnumProperty(
        name=&quot;Dropdown:&quot;,
        description=&quot;Apply Data to attribute.&quot;,
        items=[ ('OP1', &quot;Option 1&quot;, &quot;&quot;),
                ('OP2', &quot;Option 2&quot;, &quot;&quot;),
               ]
        )

# ------------------------------------------------------------------------
#    Panel in Object Mode
# ------------------------------------------------------------------------

class OBJECT_PT_CustomPanel(Panel):
    bl_label = &quot;My Panel&quot;
    bl_idname = &quot;OBJECT_PT_custom_panel&quot;
    bl_space_type = &quot;VIEW_3D&quot;   
    bl_region_type = &quot;UI&quot;
    bl_category = &quot;Tools&quot;
    bl_context = &quot;objectmode&quot;   


    @classmethod
    def poll(self,context):
        return context.object is not None

    def draw(self, context):
        layout = self.layout
        layout.use_property_split = True
        layout.use_property_decorate = False  # No animation.

        scene = context.scene
        mytool = scene.my_tool

        layout.prop(mytool, &quot;my_bool&quot;)
        layout.prop(mytool, &quot;my_enum&quot;, expand=True)
        layout.prop(mytool, &quot;my_int&quot;)
        layout.prop(mytool, &quot;my_float&quot;)
        layout.prop(mytool, &quot;my_float_vector&quot;)
        layout.prop(mytool, &quot;my_string&quot;)
        layout.prop(mytool, &quot;my_path&quot;)


# ------------------------------------------------------------------------
#    Registration
# ------------------------------------------------------------------------

classes = (
    MyProperties,
    OBJECT_PT_CustomPanel
)

def register():
    from bpy.utils import register_class
    for cls in classes:
        register_class(cls)

    bpy.types.Scene.my_tool = PointerProperty(type=MyProperties)

def unregister():
    from bpy.utils import unregister_class
    for cls in reversed(classes):
        unregister_class(cls)
    del bpy.types.Scene.my_tool


if __name__ == &quot;__main__&quot;:
    register()


Custom Operator
It's basically the same for the redo panel, you would have to create an extra row though:

import bpy


class SimpleOperator(bpy.types.Operator):
    &quot;&quot;&quot;Tooltip&quot;&quot;&quot;
    bl_idname = &quot;object.simple_operator&quot;
    bl_label = &quot;Simple Object Operator&quot;
    bl_options = {'REGISTER', 'UNDO'}
    
    my_enum: bpy.props.EnumProperty(
        name=&quot;Dropdown:&quot;,
        description=&quot;Apply Data to attribute.&quot;,
        items=[ ('OP1', &quot;Option 1&quot;, &quot;&quot;),
                ('OP2', &quot;Option 2&quot;, &quot;&quot;)])
                
    my_float: bpy.props.FloatProperty(
        name = &quot;Float Value&quot;,
        description = &quot;A float property&quot;,
        default = 23.7,
        min = 0.01,
        max = 30.0)
        
        
    @classmethod
    def poll(cls, context):
        return context.active_object is not None

    def execute(self, context):
        print(self.bl_idname)
        return {'FINISHED'}

    def draw(self, context):
        layout = self.layout
        layout.use_property_split = True
        layout.use_property_decorate = False  # No animation.

        row = layout.row(align=True)
        row.prop(self, &quot;my_enum&quot;, expand=True)
        layout.prop(self, &quot;my_float&quot;)

    
def register():
    bpy.utils.register_class(SimpleOperator)


def unregister():
    bpy.utils.unregister_class(SimpleOperator)


if __name__ == &quot;__main__&quot;:
    register()

    # test call
    #bpy.ops.object.simple_operator()