To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables, an objective function, and constraints based on the problem statement.

Let's denote:
- \(x_1\) as the number of eggs benedicts made,
- \(x_2\) as the number of hashbrowns made.

The objective is to maximize profit, with each eggs benedict contributing $4 to profit and each hashbrown contributing $2. Thus, the objective function can be represented algebraically as:
\[ \text{Maximize: } 4x_1 + 2x_2 \]

Given the constraints:
- Each eggs benedict requires 10 grams of butter, and each hashbrown requires 5 grams of butter. The total available butter is 5000 grams. This can be represented as:
\[ 10x_1 + 5x_2 \leq 5000 \]
- Each eggs benedict requires 1 egg, and each hashbrown requires 2 eggs. The total available eggs are 600. This constraint can be represented as:
\[ x_1 + 2x_2 \leq 600 \]
- Additionally, \(x_1\) and \(x_2\) must be non-negative since they represent quantities of items.

The symbolic representation in the requested format is:

```json
{
    'sym_variables': [('x1', 'eggs benedicts'), ('x2', 'hashbrowns')],
    'objective_function': '4*x1 + 2*x2',
    'constraints': ['10*x1 + 5*x2 <= 5000', 'x1 + 2*x2 <= 600', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's write the Gurobi code in Python to solve this optimization problem:

```python
from gurobipy import *

# Create a new model
m = Model("Brunch_Optimization")

# Add variables
x1 = m.addVar(name="eggs_benedicts", vtype=GRB.INTEGER, lb=0)
x2 = m.addVar(name="hashbrowns", vtype=GRB.INTEGER, lb=0)

# Set the objective function
m.setObjective(4*x1 + 2*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(10*x1 + 5*x2 <= 5000, name="butter_constraint")
m.addConstr(x1 + 2*x2 <= 600, name="eggs_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: {x1.varName} = {int(x1.x)}, {x2.varName} = {int(x2.x)}")
    print(f"Maximum profit: ${int(m.objVal)}")
else:
    print("No optimal solution found")

```