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.

### Symbolic Representation:

- **Variables:**
  - `x1`: Number of bottles of regular wine produced per day.
  - `x2`: Number of bottles of premium aged wine produced per day.

- **Objective Function:**
  The goal is to maximize profit. Given that the profit per bottle of regular wine is $20 and the profit per bottle of premium wine is $50, the objective function can be represented as:
  ```
  Maximize: 20x1 + 50x2
  ```

- **Constraints:**
  1. Demand constraint for regular wine: `x1 ≤ 80`
  2. Demand constraint for premium wine: `x2 ≤ 50`
  3. Supply constraint (total bottles of either type per day): `x1 + x2 ≤ 120`
  4. Non-negativity constraints (since production cannot be negative):
     - `x1 ≥ 0`
     - `x2 ≥ 0`

### Symbolic Representation in JSON Format:
```json
{
  'sym_variables': [('x1', 'Number of bottles of regular wine'), ('x2', 'Number of bottles of premium aged wine')],
  'objective_function': 'Maximize: 20x1 + 50x2',
  'constraints': ['x1 ≤ 80', 'x2 ≤ 50', 'x1 + x2 ≤ 120', 'x1 ≥ 0', 'x2 ≥ 0']
}
```

### Gurobi Code in Python:
To solve this linear programming problem using Gurobi, we'll write the following Python code. This code defines the model, adds variables and constraints according to our symbolic representation, and then solves for the optimal values of `x1` and `x2`.

```python
from gurobipy import *

# Create a new model
model = Model("Wine_Production")

# Add variables
x1 = model.addVar(lb=0, name="regular_wine")
x2 = model.addVar(lb=0, name="premium_wine")

# Set the objective function
model.setObjective(20*x1 + 50*x2, GRB.MAXIMIZE)

# Add constraints
model.addConstr(x1 <= 80, name="demand_regular")
model.addConstr(x2 <= 50, name="demand_premium")
model.addConstr(x1 + x2 <= 120, name="total_supply")

# Optimize the model
model.optimize()

# Print the solution
if model.status == GRB.OPTIMAL:
    print("Optimal production levels:")
    print(f"Regular wine: {x1.x} bottles")
    print(f"Premium wine: {x2.x} bottles")
    print(f"Total profit: ${20*x1.x + 50*x2.x}")
else:
    print("No optimal solution found.")
```