Brown the ground beef: Heat a Dutch oven over medium-high heat and cook the ground beef, breaking it into small crumbles with a wooden spoon, until no pink remains, about 6 minutes. Drain off most of the fat, leaving a thin layer in the pot.
Cook onion and garlic: Add the diced onion to the pot and cook until translucent, about 3 minutes. Stir in the garlic and cook for 30 seconds until fragrant.
Make the roux: Push the beef and onion to one side of the pot, melt the butter in the cleared space, then whisk in the flour. Cook for 1 minute until lightly golden and fragrant, then stir everything together.
Add broth and potatoes: Pour in the beef broth and add the diced potatoes, scraping up any browned bits stuck to the bottom of the pot. Bring the mixture to a boil.
Simmer until tender: Reduce the heat and simmer uncovered until a fork slides easily through the potatoes, 12 to 15 minutes.
Lower the heat: Turn the heat down so the soup barely bubbles before adding any dairy, which keeps the cheese from turning grainy later.
Stir in the milk: Pour in the whole milk and stir to combine, letting the soup warm through for about 2 minutes.
Melt in the cheese: Add the shredded cheddar a handful at a time, stirring until each addition melts smoothly before adding more, so the soup turns thick and glossy.
Season the soup: Stir in the smoked paprika, black pepper, and salt, then taste and adjust the seasoning as needed.
Garnish and serve: Ladle the soup into bowls and top with chopped chives or green onion while it is hot.