Assembler has the freedom to write code ranging from the self imposed structural approach to unrestrained freestyle code, each having their respective advantages. Self imposed modular coding has the advantage of organisation, particularly with larger projects where freestyle has its advantages in close range loop optimisation code.
Performance to size ratio assembler code uses both approaches which takes advantage of many of the higher level language's efficiency techniques such as code reuse while being able to specifically target speed critical code where it is necessary.
32 bit assembler is both clearer and simpler than the DOS and 16 bit Windows code and is not cursed with the complexity of segment arithmetic. You no longer have to deal with AX:DX pairs for long integers and there is no 64k boundary imposed by the segmented structure of 16 bit software.
The complexity of writing 32 bit Windows software is related to the structure of Windows and the sheer range of functions in the API set. It differs from DOS code only in so far as the parameters are passed on the stack rather than in registers as in the DOS interrupts.
While the sheer range of functions in Window can be a bit intimidating, it also puts in the hands of the assembler language programmer, a massive set of capacities that were never available in DOS.
One of the advantages of writing in assembler is that it comfortably handles the "C" format of the Windows APIs with no difficulty. Zero terminated strings, structures, pointers, data sizes etc... are all part of writing assembler.