Cook the bacon: In a large soup pot or Dutch oven, cook the diced bacon over medium heat until crispy, about 8 minutes. Use a slotted spoon to transfer the bacon crumbles to a paper towel–lined plate, reserving about 1 tablespoon of drippings in the pot.
Sauté the aromatics: Return the pot to medium heat and add the butter. Once melted, stir in the celery and onion. Cook until softened, about 5 minutes. Then add the garlic and cook for 30 seconds more.
Make the roux: Sprinkle the flour, pepper, and 1 teaspoon salt over the softened vegetables. Stir constantly for 1 to 2 minutes until the vegetables are coated and the flour smells toasty.
Whisk in the liquids: Add the broth and the beer a little at a time, whisking continuously until smooth. Increase the heat to high and bring to a boil. Boil gently for 5 to 8 minutes.
Add the potatoes: Reduce the heat to a simmer and stir in the cubed potatoes. Cook for 20 minutes, or until the potatoes are tender enough to be pierced with a fork.
Stir in the milk: Pour in the (room temperature) milk and bring back to a gentle simmer. Cook for 8–10 minutes until slightly thickened.
Blend lightly: Using an immersion blender, pulse 5–6 times in quick bursts to break down larger pieces of potato. If you do not own an immersion blender, simply mash some of the potatoes against the bottom or side of the pot with a spoon or fork.
Melt the cheese (off-heat): Turn off the heat and add the cheddar, mozzarella, and gruyere one handful at a time, whisking between each addition until fully melted and smooth.
Add the bacon and serve: Stir in ¾ of the cooked bacon, then ladle the soup into bowls and garnish with the remaining bacon and sliced green onions, if desired. Serve warm with crusty bread or pretzels for dipping. Enjoy!