If you think udev and devtmpfs conflict, you don't know what each of them are supposed to do.
If you
read about them, you'd know that devtmpfs just populates
/dev as devices are discovered by the kernel
during boot. Which means udev doesn't have to spend
several seconds parsing
/sys to populate
/dev with information the kernel already had.
Now during init, udev's job is to parse udev rules and add user configuration plus fix the permissions of nodes in
/dev. Afterwards it also monitors device addition and generates events which apps can monitor (recent versions added a gobject interface too), and adds device nodes according to rules, if any.
In essence, devtmpfs's job is to allow a bootable system without the need to maintain a static
/dev or depend on udev for a recovery shell.
devfs was bad, really bad because there was no naming system back then, and every driver did something different causing utter chaos (which led to different distros patching the kernel in different ways to change the node names). Now there's uniformity, and the kernel knows what to call the basic device nodes created by the
drivers.