To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables for the quantities of each type of table to be produced and then formulating the objective function and constraints based on these variables.

Let's define:
- \(x_1\) as the number of coffee tables to be manufactured.
- \(x_2\) as the number of bedside tables to be manufactured.

The profit made on a coffee table is $50, and on a bedside table is $90. Therefore, the objective function to maximize the total monthly profit can be represented as:
\[ \text{Maximize: } 50x_1 + 90x_2 \]

Given constraints are based on the time available for producing parts, assembling, and polishing:
1. Time for producing parts: \(2.5x_1 + 4.5x_2 \leq 6500\)
2. Time for assembling: \(3x_1 + 2x_2 \leq 3500\)
3. Time for polishing: \(1.5x_1 + 3.5x_2 \leq 5000\)

Additionally, we have non-negativity constraints since the number of tables cannot be negative:
- \(x_1 \geq 0\)
- \(x_2 \geq 0\)

Symbolic representation in JSON format is:

```json
{
    'sym_variables': [('x1', 'number of coffee tables'), ('x2', 'number of bedside tables')],
    'objective_function': '50*x1 + 90*x2',
    'constraints': [
        '2.5*x1 + 4.5*x2 <= 6500',
        '3*x1 + 2*x2 <= 3500',
        '1.5*x1 + 3.5*x2 <= 5000',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

Now, let's implement this problem using Gurobi in Python:

```python
from gurobipy import *

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

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

# Set objective function
m.setObjective(50*x1 + 90*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(2.5*x1 + 4.5*x2 <= 6500, name="parts_production")
m.addConstr(3*x1 + 2*x2 <= 3500, name="assembling")
m.addConstr(1.5*x1 + 3.5*x2 <= 5000, name="polishing")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Coffee tables: {x1.x}")
    print(f"Bedside tables: {x2.x}")
    print(f"Total profit: ${50*x1.x + 90*x2.x:.2f}")
else:
    print("No optimal solution found.")
```