Preheat your oven to 400°F and toss the turkey wings or necks with olive oil, salt, and pepper on a rimmed baking sheet. Roast for about 35 to 40 minutes, until deeply golden brown all over. This browning step is what gives you that rich, roasted flavor even without actual turkey drippings on hand.
Transfer the roasted turkey pieces into your Dutch oven, then scatter in the onion, carrots, and celery. Pour in a splash of the stock onto the hot baking sheet and scrape up any browned bits, then add that liquid to the pot too. Those browned bits carry so much flavor that I never skip this part.
Add the rest of the stock, thyme, bay leaves, and peppercorns to the pot. Bring it to a gentle simmer, then let it cook uncovered for about an hour. The liquid will reduce slightly and take on a deep amber color as the flavors concentrate together.
Pour the mixture through a fine-mesh strainer into a large bowl, pressing on the solids to extract every bit of flavor before discarding them. Let the strained stock cool to room temperature, then refrigerate it for at least an hour so the fat solidifies and becomes easy to lift off the top.
In a clean saucepan, melt the butter over medium heat and whisk in the flour a little at a time. Keep whisking constantly for about 2 minutes until the mixture turns a light golden color and smells slightly nutty. This step is what gives the gravy its smooth, velvety texture.
Slowly pour the skimmed, cooled stock into the roux while whisking constantly to prevent lumps from forming. Bring it up to a gentle simmer and let it cook for about 8 to 10 minutes, stirring often, until the gravy thickens enough to coat the back of a spoon.
Taste the gravy and adjust the salt and pepper to your liking, since the stock was made with low-sodium broth on purpose. Let it cool completely before transferring to airtight containers, ready to refrigerate or freeze until your big day arrives.