Heat the olive oil and butter together in a large heavy-bottomed pan over medium heat until shimmering and fragrant, about 2 minutes.
Add the finely chopped onion and cook, stirring frequently, until translucent and soft—about 5 minutes. You should smell a sweet aroma, and the onion will turn a delicate, glassy look.
Stir in the Arborio rice and toast it gently for about 2 minutes, stirring constantly. The rice edges will turn slightly translucent, and you'll notice a nutty aroma filling the kitchen.
Pour in the warm vegetable broth one ladle at a time, stirring continuously. Wait until almost all the liquid is absorbed before adding the next ladle. Keep the heat at a gentle simmer so the rice cooks evenly and releases its starch, creating a creamy texture.
Meanwhile, trim the asparagus by snapping off the tough ends, then chop into bite-sized pieces. Blanch the asparagus in boiling water for 2 minutes until bright green and slightly tender, then drain and set aside.
Continue adding broth and stirring, letting each addition absorb before the next, for about 18-20 minutes. The rice should become tender yet still hold a slight bite, and the mixture will turn velvety and glossy.
When the rice is almost ready, gently fold in the cooked asparagus and cook for another 2 minutes, allowing the flavors to meld and the asparagus to stay just tender and vibrant.
Remove the pan from heat and stir in the freshly grated Parmesan cheese and lemon zest, if using. Taste and season with salt and pepper as needed. The risotto should be rich, creamy, and fragrant.
Let the risotto rest for 2 minutes, then give it a gentle stir. Serve immediately, garnished with extra Parmesan and a drizzle of olive oil if desired, while it’s still hot and velvety.