To solve the optimization problem described, we first need to define the decision variables, objective function, and constraints based on the given information.

Let's denote:
- \(x_c\) as the number of coffee tables produced,
- \(x_b\) as the number of bedside tables produced.

The objective is to maximize the total monthly profit. Given that the profit made on a coffee table is $50 and on a bedside table is $90, the objective function can be written as:
\[ \text{Maximize:} \quad 50x_c + 90x_b \]

Now, let's define the constraints based on the available hours for each operation:

1. **Parts Production**: It takes 2.5 hours to produce the parts of a coffee table and 4.5 hours for those of a bedside table. The total time available for producing parts is 6500 hours.
\[ 2.5x_c + 4.5x_b \leq 6500 \]

2. **Assembly**: It takes 3 hours to assemble a coffee table and 2 hours to assemble a bedside table, with 3500 hours available for assembly.
\[ 3x_c + 2x_b \leq 3500 \]

3. **Polishing**: Polishing a coffee table requires 1.5 hours, while polishing a bedside table takes 3.5 hours. There are 5000 hours available for polishing.
\[ 1.5x_c + 3.5x_b \leq 5000 \]

Additionally, \(x_c\) and \(x_b\) must be non-negative since they represent the number of tables.

To implement this problem in Gurobi using Python, we will use the following code:

```python
from gurobipy import *

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

# Define the decision variables
x_c = m.addVar(lb=0, vtype=GRB.INTEGER, name="coffee_tables")
x_b = m.addVar(lb=0, vtype=GRB.INTEGER, name="bedside_tables")

# Set the objective function
m.setObjective(50*x_c + 90*x_b, GRB.MAXIMIZE)

# Add constraints
m.addConstr(2.5*x_c + 4.5*x_b <= 6500, "parts_production")
m.addConstr(3*x_c + 2*x_b <= 3500, "assembly")
m.addConstr(1.5*x_c + 3.5*x_b <= 5000, "polishing")

# Optimize the model
m.optimize()

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