In a heavy-bottomed saucepan over medium heat, melt the butter. Once melted and shimmering, whisk in the flour.
Cook the flour and butter mixture (this is your roux) for about 1-2 minutes, whisking constantly, until it's lightly golden and smells slightly nutty. This step is crucial for cooking out the raw flour taste.
Gradually whisk in the warmed milk, about half a cup at a time, ensuring each addition is fully incorporated and smooth before adding more. Continue whisking until all the milk is added and the mixture is smooth.
Bring the gravy to a gentle simmer, whisking frequently. Cook for about 5-8 minutes, or until the gravy has thickened to your desired consistency. It should coat the back of a spoon.
Remove the saucepan from the heat. Stir in the salt, black pepper, and cayenne pepper (if using). Taste and adjust seasonings as needed.
Serve immediately while hot and creamy.