Preheat an oven to 425°F. Trim the broccoli florets from the large, thick stems. Chop florets into large pieces. Peel the tough outer layer from the thick stems, then discard the peels. Chop the peeled stems into large pieces. Divide broccoli into 2 even piles.
Add the first pile to a parchment-lined baking sheet, and toss with 3 tablespoons olive oil, and a few pinches of kosher salt. Roast until tender and caramelized (about 20 minutes), flipping the broccoli occasionally.
While the broccoli is roasting, start the soup. Warm 2 tablespoons of olive oil and 2 tablespoons of butter in a large, heavy-bottomed pot over medium heat. Add the onion, garlic, black pepper, red pepper and large pinch of salt, cooking until the onions are soft (about 5 minutes). Add the stock, potatoes, raw broccoli and 2 pinches of salt, stirring to combine. Bring the mixture to a simmer, cover the pot, and cook until the potatoes and broccoli are just tender (about 10 minutes). Add the roasted broccoli, cover again, and cook for 10 minutes to let the flavors marry.
Add the lemon zest, and roughly puree the soup using an immersion or regular blender. The soup should have some texture to it. Stir in lemon juice, then season to taste with additional kosher salt, black pepper and lemon juice.
To serve, divide soup between 4 bowls and top with freshly grated Parmesan cheese.