Have a look at
screen_full_area(). You can save a script in a blend file that will be run when opening the file. If this is saved into the startup.blend, it will run each time you start blender.
An addon can create custom panels and menus as well as append and delete from existing menus. See this answer which adds a custom save to the file menu.
Depending on your goals, you can save a startup.blend with workspaces setup your way, you can ship this in your distribution with a local config setup.
The blenderkit addon ships with blender and does some custom drawing in the viewport, where you can drag and drop its items.
CGCookies Retopoflow is an example of adding a custom UI inside the viewport.
At the extreme end, you can make a custom build with your UI scripts. See the Fluid Designer demo as an example.