There are two different concerns in angular development that appear the same at first blush, script loading and angular's dependency injection. This ng-conf presentation is really the best to understand this.
Require / AMD handles SCRIPT loading and dependency management. Angular DI handles angular module dependency injection within the angular framework. Conceptually, AMD wraps the Angular DI. I get it right - setting up require is a PITA at the outset. Nothing is easier than script loading a file and seeing you have a new global window.angular. But globals are really an impossible way to manage a large project with multiple teams.
Using AMD also allows us to have as much code as we can as completely framework agnostic modules, and use require to sew it together. For example we have no angular.controllers in our app, and we don't use angular's templateUrl/Cache mess. Controllers are just functions in AMD's and templates are just text!template.html text dependencies loaded and connected to angular's directives or ui-router. You can't use ng-app with require, you have to call angular.bootstrap yourself after the page has domReadied.
Require has other benefits as well when it comes to build and packaging.
There is no way to load a part of a big minified.js file. It's all or nothing. When you use r.js to build your project, you only suck in the parts you need, not an entire file. For example Lodash has a lodash.min.js and a lodash_amd. Truth is, we only use a few parts of lodash, and we require ony a few utility belt type functions. When I build with r.js, it only takes in the lodash/utility/belt and it's dependencies, not the whole lib. If I had loaded the entire library I could not do that. Everything is lightweight, until it becomes heavyweight. Only require what you require !:-)
Require also has powerful loading features like configuration based cacheBust parameters, and mapping. Let's say I have a module from another group that needs jquery 1.1 and breaks with Jquery 2. Because the app doesn't use globals, I can map jquery1.1 into that module, and 2.0 into another with a configuration line.
TypeScript 1.5 can output AMD's which are loaded by require.js. It's a good safe way to load angular 1.X today, and will output ES6 modules in the future as system.js becomes more mainstream. I highly recommend Alameda as a drop in replacement for require.js if you have modern browser support. It's the same api as require.
In today's JS we are building real apps, and need better ways to manage our dependencies and loading. Hat tip @jrburke who figured all this out ten years ago :-)