Cook the bacon (if using). In a large Dutch oven or heavy pot, cook chopped bacon over medium heat until crispy. Remove with a slotted spoon and set aside on paper towels. Leave about 2 tablespoons of the bacon drippings in the pot for flavor.
Sauté the vegetables. Add the butter to the pot along with the onion and celery. Cook until softened, about 5 minutes. Stir in the garlic and cook for 1 more minute until fragrant.
Make the roux. Sprinkle the flour over the vegetables and stir well to coat. Cook for 1–2 minutes to remove the raw flour taste. The mixture will look thick and pasty.
Add the broth and potatoes. Slowly whisk in the chicken broth, scraping up any brown bits from the bottom of the pot. Add the diced potatoes, salt, pepper, thyme, and paprika. Bring to a boil, then reduce heat and simmer for 15–20 minutes, or until the potatoes are fork-tender.
Blend (optional). For a creamier texture, use an immersion blender to puree part of the soup directly in the pot, leaving some potato chunks for texture. You can also transfer half the soup to a blender, then return it to the pot.
Add the dairy and cheese. Stir in the milk, cream, and cheddar cheese until melted and smooth. Taste and adjust seasonings as needed.
Serve. Ladle into bowls and garnish with crispy bacon, more cheese, and chopped chives or green onions.