Remove the roast from the fridge 1 to 2 hours before you want to start cooking. Room-temperature beef will cook more evenly, inside and out.
Preheat the oven to 250°F.
Pat the top round roast dry with paper towels.
Tie the roast with kitchen twine and season it generously with salt and pepper on all sides. Heat 2 tablespoons olive oil in a cast iron skillet or Dutch oven set over medium-high heat. Sear the roast on all sides until browned. This will take roughly 6 minutes.
Meanwhile, combine the rosemary and garlic in a small mixing bowl; add 2 tablespoons of olive oil and stir until a paste forms.
Once the roast is browned, remove it from the heat and coat it with the prepared mixture of rosemary and garlic all over the entire surface.
Place the skillet with the roast in the preheated oven. Roast it uncovered for about 20 to 25 minutes per pound - it will take about 80 to 100 minutes for a 4-pound roast - or until the internal temperature reaches your desired level of doneness. Use a meat thermometer to check the temperature. See notes for cooking temp guidelines.
Once the roast is cooked, remove it from the oven, transfer it to a cutting board, and loosely tent it with aluminum foil. Let it rest for about 15 to 20 minutes. This resting period allows the juices to redistribute throughout the meat, making it juicier.
While the roast is resting, prepare the gravy. In the same skillet or roasting pan used for searing, melt the butter over medium heat. Add the thinly sliced onions and cook until they are caramelized and tender, stirring occasionally, for about 10 minutes.
Pour in the beef broth and wine, stirring to scrape up any browned bits from the bottom of the pan.
In a small bowl, whisk together the cornstarch with a tablespoon of cold water to create a slurry. Stir the slurry into the onion mixture and simmer for a few minutes until the gravy thickens. Remove from heat.
Slice the roast beef thinly against the grain for maximum tenderness. Serve it with the onion gravy.