Warm the milk to 105–110°F. Sprinkle in the active dry yeast and a pinch of sugar, then whisk to combine. Let stand for about 5 minutes, or until foamy.
In the bowl of a stand mixer fitted with the paddle attachment, mix the eggs, activated yeast mixture, and vanilla extract on low speed just until combined. With the mixer running, gradually add the ½ cup sugar and kosher salt, mixing until incorporated.
Gradually add the 3½ cups all-purpose flour. Once the mixture thickens and begins forming a dough, switch to the dough hook, scraping down the bowl and attachment as needed.
Knead on low speed for about 2 minutes, until the dough comes together and begins pulling away from the sides of the bowl.
Gradually add the ½ cup softened butter one piece at a time, allowing each addition to mostly incorporate before adding the next. The dough may initially separate, which is normal.
Continue kneading for about 5 minutes, until the dough comes back together and becomes more cohesive and elastic. It should remain slightly tacky, as we'll finish kneading it by hand.
Transfer the dough to a nonstick work surface lightly dusted with some of the ¼ cup flour reserved for kneading. Knead by hand, adding more from that ¼ cup only as needed, until smooth, soft, and moist without sticking excessively to your hands.
Stop adding flour once you reach the desired consistency. Continue kneading for 5–8 minutes, until the dough holds its shape while remaining slightly tacky.