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

Let's denote:
- $x_1$ as the number of leather chairs,
- $x_2$ as the number of mesh chairs.

The profit per leather chair is $250, and the cost is $500, so the store makes a profit of $250 - $500 = -$250 for each leather chair it buys (considering only the cost and not the selling price directly in this calculation would be incorrect; we actually consider profit as revenue minus cost). However, since we're looking at maximizing profit from sales, we should correctly frame our profit function based on the selling prices and costs. The profit per mesh chair is $200, with a cost of $300.

The correct framing for profit maximization, considering the selling price and cost for each type, is:
- Profit per leather chair sold = Selling Price - Cost = $250 (since this is directly given as profit).
- Profit per mesh chair sold = Selling Price - Cost = $200 (similarly, directly given).

Given these profits are after accounting for costs, our objective function to maximize profit (P) would be:
\[ P = 250x_1 + 200x_2 \]

The constraints are:
1. The total investment should not exceed $50,000.
   - Cost of a leather chair: $500
   - Cost of a mesh chair: $300
   - Total cost constraint: \(500x_1 + 300x_2 \leq 50000\)

2. The store estimates a monthly demand of at most 125 chairs.
   - Total number of chairs constraint: \(x_1 + x_2 \leq 125\)

3. Non-negativity constraints (since you can't sell a negative number of chairs):
   - \(x_1 \geq 0\)
   - \(x_2 \geq 0\)

Symbolic representation:
```json
{
    'sym_variables': [('x1', 'number of leather chairs'), ('x2', 'number of mesh chairs')],
    'objective_function': '250*x1 + 200*x2',
    'constraints': ['500*x1 + 300*x2 <= 50000', 'x1 + x2 <= 125', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="leather_chairs", lb=0)
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="mesh_chairs", lb=0)

# Objective function: Maximize profit
m.setObjective(250*x1 + 200*x2, GRB.MAXIMIZE)

# Constraints
m.addConstr(500*x1 + 300*x2 <= 50000, "Total Cost")
m.addConstr(x1 + x2 <= 125, "Total Demand")

# Optimize model
m.optimize()

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