I would create that from the players perspective:

The main aim is to have general Path a player takes, with
a limited amount of departures, so you feel a progress in the game, and not just a wild maze. This way cou can also influence
on the level-rythm. (like: spawn-explore-fight-explore-find key -bossfight-end of level)

So Basically first think about a sequence of "things" the player should encounter in that level.

For example:
-A enter medium room with enemy and ammo (possible key)
-B enter corridor with several doors (small rooms along, ich have a 25% of having some pickup or enemy)
-C entering a corner-corridor
-D entering a larger room with several enemies
-E encountering a Door, key must have been accesible before
-D entering a "Secret" rooms with lots of coins
-f entering a Hall with a boss enemy. Hall is locked by door
-g exitdoor


Now you define the "Must have" for that level.

For example a gamedesigner defienes a sequence

(Start-room), A,B,C,B,D,A,D,C,E,A,E,D,A,B,B,C,F, (G -END )

You can allow some random variations in that sequence. But it must
have G, and ist must have keys before the doors, and at least
one Boss-level in the end.


To generate your maze now, use some recursive algorythm,
that tests out combinations, and returns a list of valid rooms.
Of wich you can choose one randomly.

The specific step in the generation could be,
that you start with the spawn-room.
Now you create a randomly long corridor and add an "A" room
to the left front or side. "A" rooms are randomly between 4x4 and 7x7 quares big.
From there you create an "B" corridor to the right,left or front side, etc.., starting at a random wall square.
Then you insert a "C" corner corridor....

Each step return as invalid (recursion) if it hits the
edges of the level, or intersects with an created levelpart.
This step is thus ignore, and "the next side or wallsquare" is tried out.

-------------

For using "split" paths, you can remember the split position,
and first create things toward the one side for 5 steps or so.
Then return back to the split position and create the other 5 steps.
The requirement is, that the second split intersects with an element of the path of the first split (to not have dead ends).
Or more easy, with some previously created part of the level.


Then you could insert a door at this room where they meet again, to make a single path again... etc. etc...

--------

you can let the computer run this expensive recursicve search,
and let him return back a list of valid rooms.

From this list you select a random one.

Voila, you have a random level, that meets your gamedesign targets and retrictions.

(It should in concept generate random Levels such as in games like
Diablo or Torchlight.
There also its not a wild random area, but defined by
a gameplay defined rythm of elements to encounter.)